Maldito erro 130 para o inferno - página 4

 

k... afixará o código amanhã...

Esqueci de mencionar isto é o que acontece no backtester... Não sei como seria no futuro, mas certamente também não quero ver isso 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);
  }
 
bem? alguma idéia?
 
Roger wrote >>

Realmente é hora de mostrar o código inteiro. Se você hesitar, você pode usar o PM.

Vejo que você tem o TP mais baixo que o Bid

Após fixar o TP < Bid Issue, meu nível de parada foi 0 para este corretor, então eu não podia ter nenhum SL ou TP com o pedido e tinha que usar a ordem de modificação logo após a colocação do pedido.

Obrigado por sua ajuda,

BB

 

Eu não vejo onde você vê o conjunto TP, pois eu não postei a linha real que o produziu, que é:

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 você vê, tanto SL como TP estão zerados.
 

WOAA.... É minha culpa - os preços não são a mesma fórmula

Edição posterior:

A correção não resolve o problema... ela ainda acontece, embora não tenha a mesma ocorrência.

 
Resolvido... STOPLEVEL ainda importa quando não se tem SL ou TP...