Announcement

Collapse
No announcement yet.

Problema nella modifica del tp

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Problema nella modifica del tp

    Salve a tutti, ho creato la seguente funzione che mi modifica il tp a secondo il valore di una media:

    PHP Code:
    void TPMedia(int MediaTrandPeriodint MediaTrandMethod,int nMagic){

    for (
    int i=OrdersTotal()-1i>=0i--)
    {
    if( 
    OrderSelectiSELECT_BY_POSMODE_TRADES ) == false ) {
    Print(
    "ERROR - Unable to select the order - ",GetLastError());
    continue;}
    if(
    OrderSymbol()!=Symbol())continue;
    if(
    OrderMagicNumber()!= nMagic)continue;
    //Prepare the prices
    double TakeProfitPrice=OrderTakeProfit();
    double OpenPrice=OrderOpenPrice();
    double NewTakeProfitPrice=TakeProfitPrice;

    double MAValue=iMA(NULL,0,MediaTrandPeriod,0,MediaTrandMe thod,0,1);
    RefreshRates();

    if(
    OrderType()==OP_BUY)
    {
    NewTakeProfitPrice=NormalizeDouble(MAValue,Digits) ;
    if(
    OrderModify(OrderTicket(),OrderOpenPrice(),0,Ne wTakeProfitPrice,0,Yellow))
    Print(
    "Order modified");
    else
    Print(
    "Order failed to update with error - buy ",GetLastError());
    }
    if(
    OrderType()==OP_SELL)
    {
    NewTakeProfitPrice=NormalizeDouble(MAValue,Digits) ;
    if(
    OrderModify(OrderTicket(),OrderOpenPrice(),0,Ne wTakeProfitPrice,0,Yellow))
    Print(
    "Order modified");
    else
    Print(
    "Order failed to update with error - sell ",GetLastError());
    }

    }
    //Wait a delay
    Sleep(5);


    A volte mi da questo errore "2020.11.20 15:26:29.154 2019.08.20 02:00:00 Moving Averages Levels EURUSDc,H1: Order failed to update with error - buy 1" ho pensato che è il fatto che la media modifica il Take meno del minimo spostamento che è consentito su quel determinato cross e l'ho modificata nel seguente modo:


    [PHP]
    ..............
    dStopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);
    if (p != Point) dStopLevel = dStopLevel/10;
    dStopLevel *= p;
    ...................................

    void TPMedia(int MediaTrandPeriod, int MediaTrandMethod,int nMagic)
    {

    for (int i=OrdersTotal()-1; i>=0; i--)
    {
    if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false ) {
    Print("ERROR - Unable to select the order - ",GetLastError());
    continue;}
    if(OrderSymbol()!=Symbol())continue;
    if(OrderMagicNumber()!= nMagic)continue;
    //Prepare the prices
    double TakeProfitPrice=OrderTakeProfit();
    double OpenPrice=OrderOpenPrice();
    double NewTakeProfitPrice=TakeProfitPrice;
    double MAValue=iMA(NULL,0,MediaTrandPeriod,0,MediaTrandMe thod,0,1);
    if (NewTakeProfitPrice>dStopLevel)
    {
    RefreshRates();
    if(OrderType()==OP_BUY)
    {
    NewTakeProfitPrice=NormalizeDouble(MAValue,Digits) ;
    if(OrderModify(OrderTicket(),OrderOpenPrice(),0,Ne wTakeProfitPrice,0,Yellow))
    Print("Order modified");
    else
    Print("Order failed to update with error - buy ",GetLastError());
    }
    if(OrderType()==OP_SELL)
    {
    NewTakeProfitPrice=NormalizeDouble(MAValue,Digits) ;
    if(OrderModify(OrderTicket(),OrderOpenPrice(),0,Ne wTakeProfitPrice,0,Yellow))
    Print("Order modified");
    else
    Print("Order failed to update with error - sell ",GetLastError());
    }
    else
    Print("TP troppo stretto ",GetLastError());

    }
    //Wait a delay
    Sleep(5);
    }
    }
    [PHP]
    In modo che prima di modificare il tp mi faccia il controllo di qual'è il minimo tp impostabile però invece di risolvere la cosa oltre a quell'errore mi si aggiunge pure questo:
    "2020.11.20 15:45:40.806 2018.01.05 17:00:00 Moving Averages Levels Temp EURUSDc,H1: invalid lots amount for OrderSend function""2020.11.20 15:46:05.691 2018.01.19 23:00:00 Moving Averages Levels Temp EURUSDc,H1: OrderSend error 4051"
    Ma non capisco il motivo perche non tocco i lotti di entrata;
    Avete idee su come sistemare il problema?

    #2
    Errore 1 nella doc ufficiale è riportato come "No error returned, but the result is unknown"
    non è un errore, ma probabilmente alla OrderModify stai passando i medesimi valori rispetto ai precedenti.

    Errore 4051 è "Invalid function parameter value"
    stai passando dei parametri errati alla OrderSend, funzione che non compare nel codice che hai postato qui e non posso vedere come la invochi

    Non ho capito come mai fai queste assegnazioni

    PHP Code:
    //Prepare the prices
    double TakeProfitPrice=OrderTakeProfit();
    double OpenPrice=OrderOpenPrice();
    double NewTakeProfitPrice=TakeProfitPrice
    sembrerebbero superflue perchè poi nella OrderModify usi

    PHP Code:
    NewTakeProfitPrice=NormalizeDouble(MAValue,Digits) ;
    if(
    OrderModify(OrderTicket(),OrderOpenPrice(),0,NewTakeProfitPrice,0,Yellow)) 
    Spero di averti dato dei suggerimenti utili.

    Un saluto

    Comment


      #3
      Allora ho risolto gli errori precedenti però ora mi dà quest'altro errore
      "2020.12.09 17:43:09.709 2018.01.08 21:00:00 Moving Averages Levels Temp (15) EURUSDc,H1: TPMedia Order failed to update with error - sell 130OrderTicket: 15"
      allora io ho modificato l'errore in questo modo

      PHP Code:
      void TPMedia(int MediaTrandPeriodint MediaTrandMethod,int nMagic)
      {
      int MinTpMarketInfo(Symbol(), MODE_STOPLEVEL) + MarketInfo(Symbol(), MODE_SPREAD);
      for (
      int i=OrdersTotal()-1i>=0i--)
      {
      if( 
      OrderSelectiSELECT_BY_POSMODE_TRADES ) == false ) {
      Print(
      "ERROR - Unable to select the order - ",GetLastError());
      continue;}
      if(
      OrderSymbol()!=Symbol())continue;
      if(
      OrderMagicNumber()!= nMagic)continue;
      //Prepare the prices
      double MAValue=iMA(NULL,0,MediaTrandPeriod,0,MediaTrandMe thod,0,1);
      double MinTakeProfitMarketInfo(Symbol(), MODE_STOPLEVEL) + MarketInfo(Symbol(), MODE_SPREAD);
      double NewTakeProfitPrice=NormalizeDouble(MAValue,Digits) ;
      RefreshRates();
      if (
      NewTakeProfitPriceMinTakeProfit)
      {
      NewTakeProfitPrice==MinTakeProfit;
      Print(
      "NewTakeProfitPrice==MinTakeProfit");

      }

      if(
      OrderType()==OP_BUY)
      {
      if(
      OrderModify(OrderTicket(),OrderOpenPrice(),SLBu y,NewTakeProfitPrice,0,Yellow))
      Print(
      "TPMedia Order modified");
      else
      Print(
      "TPMedia Order failed to update with error - buy ",GetLastError(), "OrderTicket: "OrderTicket());
      }

      if(
      OrderType()==OP_SELL)
      {
      if(
      OrderModify(OrderTicket(),OrderOpenPrice(),SLSe ll,NewTakeProfitPrice,0,Yellow))
      Print(
      "TPMedia Order modified");
      else
      Print(
      "TPMedia Order failed to update with error - sell ",GetLastError(), "OrderTicket: "OrderTicket());
      }



      }
      //Wait a delay
      Sleep(5);


      cosi da controllare i minimi punti di take, però mi da lo stesso l'errore, avete consigli su come risolvere il problema??

      Comment


        #4
        Originally posted by senapazio View Post
        Errore 1 nella doc ufficiale è riportato come "No error returned, but the result is unknown"
        non è un errore, ma probabilmente alla OrderModify stai passando i medesimi valori rispetto ai precedenti.
        Questo errore da problemi a livello di funzionamento dell'ea ? anche perchè ho provato a "gestire l'errore" con la funzione:
        PHP Code:
         int Fun_Error(int Error// Function of processing errors
        {
        Print(
        "Numero errore: " +Error);
        switch(
        Error)
        {
        case 
        1:
        Print(
        "Ordine Invariato");
        return (
        0);
        case 
        4:
        Print(
        "Trade server is busy. Trying once again..");
        Sleep(3000); // Simple solution
        return(1); // Exit the function
        case 135:
        Print(
        "Price changed. Trying once again..");
        RefreshRates(); // Refresh rates
        return(1); // Exit the function
        case 136:
        Print(
        "No prices. Waiting for a new tick..");
        while(
        RefreshRates()==false// Till a new tick
        Sleep(1); // Pause in the loop
        return(1); // Exit the function
        case 137:
        Print(
        "Broker is busy. Trying once again..");
        Sleep(3000); // Simple solution
        return(1); // Exit the function
        case 146:
        Print(
        "Trading subsystem is busy. Trying once again..");
        Sleep(500); // Simple solution
        return(1); // Exit the function
        // Critical errors
        case 2:
        Print(
        "Common error.");
        return(
        0); // Exit the function
        case 5:
        Print(
        "Old terminal version.");
        //Work=false; // Terminate operation
        return(0); // Exit the function
        case 64:
        Print(
        "Account blocked.");
        //Work=false; // Terminate operation
        return(0); // Exit the function
        case 133:
        Print(
        "Trading forbidden.");
        return(
        0); // Exit the function
        case 134:
        Print(
        "Not enough money to execute operation.");
        return(
        0); // Exit the function
        default:
        Alert("Error occurred: ",Error); // Other variants
        return(0); // Exit the function
        }

        però l'errore me lo dà ugualmente :"2020.12.17 11:49:18.849 2018.10.23 12:00:00 OlafEaVer1 EURUSDc,H1: OrderModify error 1"
        e poi mi dà l'errore gestito dalla funzione:";
        come si può risolvere?

        Comment

        Working...
        X