Código de erro "0"?

 

Estou lutando para entender porque as posições longas funcionam e os negócios curtos não funcionam?

Tenho a sensação de que tem algo a ver com minha função de init para determinar o número de casas decimais com o corretor em mãos. (como isto parece ser o culpado por que as ordens fantasmas são expulsas logo no início de quando eu inicio o testador...)

Alguém tem alguma idéia por que o lado curto está me dizendo este erro?


Obrigado antecipadamente (o código está um pouco confuso no momento, pretendo limpá-lo, é claro!)

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

   double ticksize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (ticksize == 0.00001 || ticksize == 0.001) // if you set this to 0 it WONT throw an order out straight away.
   pips = ticksize*10;
   else pips = ticksize;  
   

   return(0);
  }
//+----

//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+

void OrderEntry (int direction)
{    
   
  int PositionIndex;    //  <-- this variable is the index used for the loop
  int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool
  TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable
   
   
   double s12 = iMA(NULL,60,60,0,1,0,1); 
   double i121 = iMA(NULL,60,60,0,1,0,1);
   
   double LotSize=0;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent*0.01;

   int iTBT= iBarShift(NULL,60, triggerBarTime, true),
        iHH= iHighest(NULL,60, MODE_HIGH, iTBT + 1, 0); 
            double buyPrice = High[iHH]+PadAmount*pips;
   
   
    int iTBT_1= iBarShift(NULL,60, triggerBarTime1, true),
        iLL= iLowest(NULL,60, MODE_LOW, iTBT_1 + 1, 0); 
            double sellPrice = Low[iLL]-PadAmount*pips;
            
   
   double buy_stop_price = iMA(NULL,60,60,0,1,0,1)-PadAmount*pips; 
   double pips_to_bsl = buyPrice-buy_stop_price;         
   double buy_takeprofit_price = (pips_to_bsl*RewardRatio)+buyPrice;   
   double sell_stop_price = iMA(NULL,60,60,0,1,0,1)+PadAmount*pips; 
   double pips_to_ssl = sell_stop_price-sellPrice;     
   double sell_takeprofit_price = sellPrice-(pips_to_ssl*RewardRatio);
   
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//+----------------------------------------------------------------------------------------------------------------------------------------+   
   
  
if (direction==0) //--Buy--//
   {
      
      {
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10;
      if(OpenOrdersThisPair(Symbol())==0) 
      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); 
      
      if(BuyTicketOrder > 0)
         {
         Print("Order Placed #", BuyTicketOrder);
         }
      else
         {
         Print("Order Send Failed, error # ", GetLastError());   
         }
  
      }
   }

            
if (direction==1)//--Sell--//
   {
      {
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)  
      int SellTicketOrder = OrderSend(Symbol(),OP_SELLSTOP,LotSize,sellPrice,3,ssl,stp,NULL,MagicNumber,0,Red); 
  
      if(SellTicketOrder > 0)
         {
         Print("Order Placed #", SellTicketOrder);
         }
      else
         {
         Print("Order Send Failed, error # ", GetLastError());   
         }
 
      }
   }
} 
 

entra em negócios quando você comenta

//if(OpenOrdersThisPair(Symbol())==0
entra quando
LotSize = 0.1;
etc. trabalhe seu caminho de volta até começar a entrar em negócios, uma vez lá você provavelmente saberá qual é o problema.hth
 
Sim, entra no lado comprido mesmo com o tamanho do lote "0".

Mudar o OpenOrderThisPair também não funciona.... Hmmm. É muito estranho...
 
DomGilberto:
Sim, ele entra no lado comprido mesmo com o tamanho do lote "0"...

Mudar o OpenOrderThisPair também não funciona.... Hmmm. É muito estranho. ...

Se este teste retornar não zero . .

if(OpenOrdersThisPair(Symbol()) == 0)  

. o OrderSend() não é chamado, mas você ainda verifica se o SellTicketOrder é maior que 0 . .

Faça isso . . .

if (direction==1)//--Sell--//
   {
      {
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)
         {
         int SellTicketOrder = OrderSend(Symbol(),OP_SELLSTOP,LotSize,sellPrice,3,ssl,stp,NULL,MagicNumber,0,Red); 
  
         if(SellTicketOrder > 0)
            {
            Print("Order Placed #", SellTicketOrder);
            }
         else
            {
            Print("Order Send Failed, error # ", GetLastError());   
            }
         }
      }
 
Não - não parece querer enviar a ordem de venda...

Deve ser um erro na forma como escrevi o código relativo às declarações "IF" dentro do laço que envia a função OrderEntry para acionar uma ordem...
 
DomGilberto:
Não - não parece querer enviar a ordem de venda...

Deve ser um erro na forma como escrevi o código relativo às declarações "IF" dentro do laço que envia a função OrderEntry para acionar uma ordem...

Então que erro você recebe agora ? se você não receber um e não receber "Order put # 12345" então o OrderSend() não está sendo chamado e você tem um problema com sua função OpenOrdersThisPair() . . poste seu código.
 
Quando isto funciona, funciona bem há muito tempo (há duas horas que estou brincando com isto). O mais provável é que eu o dê corda a você e a uma certa pessoa, pois sei onde estou indo errado (onde chamo de função"CheckForMaTrade") com relação às declarações IF relativas aos parâmetros de média móvel, e como se elas forem "verdadeiras", enviará OrderEntry para OrderSend... O problema é que ainda estou aprendendo a escrever essa parte corretamente...
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

int start()
  {
//----
   
   if(OpenOrdersThisPair(Symbol())>=1)
      {
      if(UseMoveToBreakEven)MoveToBreakEven();
      if(UseTrailingStop)AdjustTrail();
      if(Use_MA_Trail)MA_Trail();
      }
      if(IsNewCandle())CheckForMaTradeLong();
      if(IsNewCandle())CheckForMaTradeShort();
//----
   return(0);
  }
 
DomGilberto:
Quando isto funciona, funciona bem há muito tempo (há duas horas que estou brincando com isto). O mais provável é que eu o dê corda a você e a uma certa pessoa, pois sei onde estou indo errado (onde chamo de função "CheckForMaTrade") com relação às declarações IF relativas aos parâmetros de média móvel, e como se elas forem "verdadeiras", enviará OrderEntry para OrderSend... O problema é que eu ainda estou aprendendo a escrever essa parte corretamente...

RaptorUK:
Então que erro você recebe agora ? se você não receber um e não receber "Order placed # 12345" então o OrderSend() não está sendo chamado e você tem um problema com sua função OpenOrdersThisPair() . . poste seu código.


Portanto ... . . que erro você recebe, etc . .
 
Oh, desculpe - não estou mais recebendo nenhum erro, o que é verdade. Estou recebendo apenas ordens de compra em andamento e nenhuma ordem de venda.

É em relação à minha linha anterior com relação ao cross overs de MA - ainda não entendi! Mas não quero dar corda a ninguém e bater em um cavalo morto enquanto as pessoas me dão a resposta (embora eu não entenda a resposta rs)! Abraço o RaptorUK por sua ajuda!
 
     if(IsNewCandle())CheckForMaTradeLong();
     if(IsNewCandle())CheckForMaTradeShort();
Embora eu apoie operações de factoring em funções, não o faço para a maioria das variações de New Candle/New Bar porque essa função só pode ser chamada ONCE [por start()]
int start(){
   static datetime time0; bool isNewCandle = time0 != Time[0]; time0 = Time[0]; // Once per start only.
   :
      if(isNewCandle)CheckForMaTradeLong();
      if(isNewCandle)CheckForMaTradeShort();
 
Obrigado WHRoeder - boa dica!