Maldito error 130 al infierno - página 4

 

k... publicaré el código mañana...

Olvidé mencionar que esto es lo que sucede en backtester... No sé en adelante cómo iría, pero ciertamente no quiero ver esto allí tampoco.

 
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);
  }
 
¿alguna idea?
 
Roger wrote >>

Realmente es el momento de mostrar todo el código. Si dudas, puedes usar el PM.

Veo que tienes el TP más bajo que el Bid

Después de arreglar el problema de TP < Bid resultó que mi nivel de stop era 0 para este broker así que no pude tener ningún SL o TP con la orden y tengo que usar la orden de modificar justo después de colocar la Orden.

Gracias por su ayuda,

BB

 

No veo dónde ves el conjunto de TP, ya que no he posteado la línea real que lo produce, que es:

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) );
como ves, tanto el SL como el TP están puestos a cero...
 

WOAA....Es culpa mía... los precios no son la misma fórmula

Edición posterior:

La corrección no resuelve el problema... sigue ocurriendo, aunque no tiene la misma ocurrencia.

 
Resuelto... STOPLEVEL importa todavía cuando no tiene SL o TP...