Dannato errore 130 all'inferno - pagina 4

 

k... posterò il codice domani...

Ho dimenticato di dire che questo è ciò che accade su backtester... Non so in avanti come andrebbe, ma certamente non voglio vedere questo anche lì.

 
int PriceOpenMode(int op)
  {
  if ( op==OP_BUY)
     return(MODE_ASK);
  if ( op==OP_SELL)
     return(MODE_BID);
  return(-1);
  }


int PriceCloseMode(int op)
  {
  if ( op==OP_BUY)
     return(MODE_BID);
  if ( op==OP_SELL)
     return(MODE_ASK);
  return(-1);
  }
  


int ReliableOrderSend(string symbol,int cmd,double volume,double price,int slippage,double stoploss,double takeprofit, string comment="",int magic=0,datetime expiration=0,color arrow_color=CLR_NONE,int MaxPasses=0) 
  {  
  int Gle= ERR_TRADE_CONTEXT_BUSY;        
  int passes=0;  
  int res=-1;  
  while ( Gle== ERR_TRADE_CONTEXT_BUSY|| Gle== ERR_REQUOTE|| Gle== ERR_INVALID_PRICE|| Gle== ERR_PRICE_CHANGED|| Gle== ERR_OFF_QUOTES)
       {  
          
       if ( Gle== ERR_REQUOTE|| Gle== ERR_INVALID_PRICE|| Gle== ERR_PRICE_CHANGED|| Gle== ERR_OFF_QUOTES|| passes==0)
         {
         if ( passes!=0)
            RefreshRates();
         if ( price==0.0)  //if (passes!=0||price==0)
            price=MarketInfo( symbol, PriceOpenMode( cmd));
         }//if (Gle==ERR_REQUOTE)                        
       res=OrderSend( symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);   
       Gle=GetLastError();       
       if ( Gle!= ERR_NO_ERROR)
          Print("ReliableOrderSend error : ", Gle);              
       passes= passes+1;
       
       if ( MaxPasses!=0)
         {
          if ( passes>= MaxPasses)
            break;
         }

       if ( Gle== ERR_REQUOTE|| Gle== ERR_INVALID_PRICE|| Gle== ERR_PRICE_CHANGED|| Gle== ERR_OFF_QUOTES) { price=0.0; }
         
       }//while (Gle==ERR_TRADE_CONTEXT_BUSY||Gle==ERR_REQUOTE)       
  return( res);
  }
     

bool ReliableOrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE,int MaxPasses=0) 
  {
  int Gle= ERR_TRADE_CONTEXT_BUSY;
  int passes=0;  
  bool res;
  int otype;
  double olots;
  string osymbol;
  res=OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES);
  osymbol=OrderSymbol();
  otype=OrderType();
  olots=OrderLots();  
  if ( lots==0)
     lots= olots;  
  if ( res== True)
    {
    while ( Gle== ERR_TRADE_CONTEXT_BUSY|| Gle== ERR_REQUOTE|| Gle== ERR_INVALID_PRICE|| Gle== ERR_PRICE_CHANGED|| Gle== ERR_OFF_QUOTES)
       {     
       if ( Gle== ERR_REQUOTE|| Gle== ERR_INVALID_PRICE|| Gle== ERR_PRICE_CHANGED|| Gle== ERR_OFF_QUOTES|| passes==0)
         {
         if ( passes!=0)
            RefreshRates();
         if ( price==0.0)  //if (passes!=0||price==0)
            price=MarketInfo( osymbol, PriceCloseMode( otype));
         }//if (Gle==ERR_REQUOTE)                               
       res=OrderClose( ticket, lots, price, slippage, Color);   
       Gle=GetLastError();
       if ( Gle!= ERR_NO_ERROR)
          Print("ReliableOrderClose error : ", Gle);           
       passes= passes+1;
       
       if ( MaxPasses!=0)
         {
          if ( passes>= MaxPasses)
            break;
         }
       
       if ( Gle== ERR_REQUOTE|| Gle== ERR_INVALID_PRICE|| Gle== ERR_PRICE_CHANGED|| Gle== ERR_OFF_QUOTES) { price=0.0; }

       }//while (Gle==ERR_TRADE_CONTEXT_BUSY||Gle==ERR_REQUOTE)  
    }
  return( res);
  }
 
bool ReliableModifyStopLoss(int ticket,double NewStopLoss,int MarkColor=CLR_NONE)
  {
  int ot, oti;
  datetime oex;
  string os;
  double oop, otp, point;
  bool res=false;
  bool selected=false;  
  double fixed;
  selected=OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES);   
  if ( selected== True)
    {
     double ns=NormalizeDouble( NewStopLoss,MarketInfo(OrderSymbol(),MODE_DIGITS));
     ot=OrderType();     
     oti=OrderTicket();
     oop=OrderOpenPrice();
     otp=OrderTakeProfit();
     oex=OrderExpiration();
     os=OrderSymbol();
     point=MarketInfo( os,MODE_POINT);
     if ( ot==OP_BUY|| ot==OP_BUYSTOP|| ot==OP_BUYLIMIT)
       {       
        fixed=MarketInfo( os,MODE_ASK)-MarketInfo( os,MODE_STOPLEVEL)* point;
        if ( ns> fixed&& ns<=MarketInfo( os,MODE_ASK))
          ns= fixed;
        while(true)
          {
           res=OrderModify( oti, oop, ns, otp, oex, MarkColor);
           if ( res== True)
             break;
           else 
            {
             if (GetLastError()== ERR_INVALID_STOPS)               
               ns= ns- point;
             else
               break;
            }
           RefreshRates();
          }//while(true)
       }//if (ot==OP_BUY||ot==OP_BUYSTOP||ot==OP_BUYLIMIT)
     if ( ot==OP_SELL|| ot==OP_SELLSTOP|| ot==OP_SELLLIMIT)
       {
        fixed=MarketInfo( os,MODE_BID)+MarketInfo( os,MODE_STOPLEVEL)* point;
        if ( ns< fixed&& ns>=MarketInfo( os,MODE_BID))
          ns= fixed;       
        while(true)
          {           
           res=OrderModify( oti, oop, ns, otp, oex, MarkColor);
           if ( res== True)
             break;
           else 
            {
             if (GetLastError()== ERR_INVALID_STOPS)               
               ns= ns+ point;             
             else
               break;
            }
           RefreshRates();
          }//while(true)
       }//if (ot==OP_BUY||ot==OP_BUYSTOP||ot==OP_BUYLIMIT)
    }   
  return( res);  
  }

bool ReliableModifyTakeProfit(int ticket,double NewTakeProfit,int MarkColor=CLR_NONE)
  {
  int ot, oti;
  datetime oex;
  string os;
  double oop, osl, point;
  bool res=false;
  bool selected=false;  
  double fixed;
  selected=OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES);   
  if ( selected== True)
    {
     double nt=NormalizeDouble( NewTakeProfit,MarketInfo(OrderSymbol(),MODE_DIGITS));
     ot=OrderType();     
     oti=OrderTicket();
     oop=OrderOpenPrice();
     osl=OrderStopLoss();
     oex=OrderExpiration();
     os=OrderSymbol();
     point=MarketInfo( os,MODE_POINT);
     if ( ot==OP_BUY|| ot==OP_BUYSTOP|| ot==OP_BUYLIMIT)
       {       
        fixed=MarketInfo( os,MODE_ASK)+MarketInfo( os,MODE_STOPLEVEL)* point;       
        if ( nt< fixed&& nt>=MarketInfo( os,MODE_ASK))
          nt= fixed;
        while(true)
          {           
           res=OrderModify( oti, oop, osl, nt, oex, MarkColor);
           if ( res== True)
             break;
           else 
            {
             if (GetLastError()== ERR_INVALID_STOPS)               
               nt= nt+ point;
             else
               break;
            }
           RefreshRates();
          }//while(true)
       }//if (ot==OP_BUY||ot==OP_BUYSTOP||ot==OP_BUYLIMIT)
     if ( ot==OP_SELL|| ot==OP_SELLSTOP|| ot==OP_SELLLIMIT)
       {
        fixed=MarketInfo( os,MODE_BID)-MarketInfo( os,MODE_STOPLEVEL)* point;
        if ( nt> fixed&& nt<=MarketInfo( os,MODE_BID))
          nt= fixed;       
        while(true)
          {           
           res=OrderModify( oti, oop, osl, nt, oex, MarkColor);
           if ( res== True)
             break;
           else 
            {
             if (GetLastError()== ERR_INVALID_STOPS)               
               nt= nt- point;             
             else
               break;
            }
           RefreshRates();
          }//while(true)
       }//if (ot==OP_BUY||ot==OP_BUYSTOP||ot==OP_BUYLIMIT)
    }   
  return( res);  
  }


int ReliableOrderPlace(string symbol,int cmd,double volume,double price,int slippage,int stoploss,int takeprofit, string comment="",int magic=0,datetime expiration=0,color arrow_color=CLR_NONE,int MaxPasses=0) 
  {
   int res, ticket;
   double oop, tkp, osl;
   res= ReliableOrderSend( symbol, cmd, volume, price, slippage,0,0, comment, magic, expiration, arrow_color, MaxPasses); 
   if ( res!=-1)
     {
      ticket=OrderSelect( res, SELECT_BY_TICKET, MODE_TRADES);      
      oop=OrderOpenPrice();
      if ( takeprofit!=0)
        {
         if ( cmd==OP_BUY|| cmd==OP_BUYLIMIT|| cmd==OP_BUYSTOP)
           tkp= oop+ takeprofit*MarketInfo( symbol,MODE_POINT);
         if ( cmd==OP_SELL|| cmd==OP_SELLLIMIT|| cmd==OP_SELLSTOP)
           tkp= oop- takeprofit*MarketInfo( symbol,MODE_POINT);         
         ReliableModifyTakeProfit( res, tkp);
        }
     }
   if ( res!=-1)
     {
      ticket=OrderSelect( res, SELECT_BY_TICKET, MODE_TRADES);      
      oop=OrderOpenPrice();
      if ( stoploss!=0)
        {
         if ( cmd==OP_BUY|| cmd==OP_BUYLIMIT|| cmd==OP_BUYSTOP)
           osl= oop- stoploss*MarketInfo( symbol,MODE_POINT);
         if ( cmd==OP_SELL|| cmd==OP_SELLLIMIT|| cmd==OP_SELLSTOP)
           osl= oop+ stoploss*MarketInfo( symbol,MODE_POINT);         
         ReliableModifyStopLoss( res, osl);
        }
     }
    return( res);
  }
 
Allora? Qualche idea?
 
Roger wrote >>

È davvero il momento di mostrare tutto il codice. Se esitate, potete usare il PM.

Vedo che hai un TP inferiore al Bid

Dopo aver risolto il problema del TP < Bid ho scoperto che il mio livello di stop era 0 per questo broker, quindi non potevo avere alcun SL o TP con l'ordine e dovevo usare la modifica dell'ordine subito dopo aver piazzato l'ordine.

Grazie per il vostro aiuto,

BB

 

Non vedo dove vedi il set TP, dato che non ho postato la linea effettiva che lo produce, che è:

tsel= ReliableOrderSend(Symbol(), WhatOperation(OP_SELL, GetPylonRoot( execpyl,MODE_HIGH)+(2* Half)*( BuildLevels+ execlev)), LotSize, HighBase+(2* Half)*( BuildLevels+ execlev), Slippage,0,0,"", MakeMagic( execpyl, execlev+1, execarea) );
come vedi, sia SL che TP sono impostati a zero...
 

WOAA....È colpa mia - i prezzi non sono la stessa formula

Modifica successiva:

La correzione non risolve il problema... succede ancora, anche se non ha la stessa ricorrenza.

 
Risolto... STOPLEVEL conta ancora quando non si ha SL o TP...