Codice di errore "0"?

 

Sto lottando per capire perché le posizioni lunghe funzionano e quelle corte no?

Ho la sensazione che abbia qualcosa a che fare con la mia funzione init per determinare il numero di posizioni decimali con il broker dato a portata di mano. (dato che questo sembra essere il colpevole del perché gli ordini fantasma vengono buttati fuori proprio all'inizio di quando avvio il tester...)

Qualcuno ha qualche idea sul perché il lato corto mi dice questo errore?


Grazie in anticipo (il codice è un po' disordinato al momento, ho intenzione di ripulirlo ovviamente!)

//+------------------------------------------------------------------+
//| 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());   
         }
 
      }
   }
} 
 

inserisce le compravendite quando si commentano

//if(OpenOrdersThisPair(Symbol())==0
entra quando
LotSize = 0.1;
ecc. lavora all'indietro fino a quando inizia a inserire le compravendite, una volta lì probabilmente saprai qual è il problema. hth
 
Sì, entra sul lato lungo anche con dimensione del lotto "0"...

Anche cambiare l'OpenOrderThisPair non funziona .... Hmmm. È molto strano...
 
DomGilberto:
Sì, entra sul lato lungo anche con dimensione del lotto "0" ...

Anche cambiare l'OpenOrderThisPair non funziona.... Hmmm. È molto strano...

Se questo test restituisce non zero . . .

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

. . . l'OrderSend() non viene chiamato, ma si controlla comunque se SellTicketOrder è maggiore di 0 . . .

Fai questo . . .

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());   
            }
         }
      }
 
No - non sembra voler inviare l'ordine di vendita...

Deve essere un errore nel modo in cui ho scritto il codice per quanto riguarda le istruzioni "IF" all'interno del ciclo for che invia la funzione OrderEntry per attivare un ordine...
 
DomGilberto:
No - non sembra voler inviare l'ordine di vendita...

Deve essere un errore nel modo in cui ho scritto il codice per quanto riguarda le istruzioni "IF" all'interno del ciclo for che invia la funzione OrderEntry per attivare un ordine...

Quindi, quale errore ricevi ora? Se non ne ricevi uno e non ottieni "Order placed # 12345" allora la funzione OrderSend() non viene chiamata e hai un problema con la tua funzione OpenOrdersThisPair()... pubblica il tuo codice.
 
Quando questo funziona, funziona bene per il lato lungo (ci sto giocando da 2 ore). Il fatto è che molto probabilmente farò arrabbiare te e un certo qualcuno, perché so dove sto sbagliando (dove chiamo la funzione"CheckForMaTrade") per quanto riguarda le istruzioni IF relative ai parametri della media mobile, e come se sono "vere" invierà OrderEntry a OrderSend... Il problema è che sto ancora imparando a scrivere correttamente quella parte...
//+------------------------------------------------------------------+
//| 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 questo funziona, funziona bene per il lato lungo (ci sto giocando da 2 ore). Il fatto è che molto probabilmente farò arrabbiare te e un certo qualcuno, perché so dove sto sbagliando (dove chiamo la funzione "CheckForMaTrade") per quanto riguarda le istruzioni IF relative ai parametri della media mobile, e come se sono "vere" invierà OrderEntry a OrderSend... Il problema è che sto ancora imparando a scrivere correttamente quella parte...

RaptorUK:
Quindi quale errore ottieni ora? Se non ne ottieni uno e non ottieni "Order placed # 12345" allora la funzione OrderSend() non viene chiamata e hai un problema con la tua funzione OpenOrdersThisPair() . . . posta il tuo codice.


Quindi... . che errore ottieni, ecc . . .
 
Oh, scusate - non ricevo più alcun errore. Ricevo solo ordini di acquisto che passano e nessun ordine di vendita...

E' in relazione al mio precedente thread riguardante i cross over delle MA - non l'ho ancora capito! Ma non voglio far arrabbiare nessuno e battere un cavallo morto mentre la gente mi sta dando la risposta (anche se non capisco la risposta lol)! Grazie RaptorUK per il tuo aiuto!
 
     if(IsNewCandle())CheckForMaTradeLong();
     if(IsNewCandle())CheckForMaTradeShort();
Mentre sostengo il factoring delle operazioni nelle funzioni, non lo faccio per la maggior parte delle variazioni di New Candle/New Bar perché quella funzione può essere chiamata solo UNA VOLTA [per start()].
int start(){
   static datetime time0; bool isNewCandle = time0 != Time[0]; time0 = Time[0]; // Once per start only.
   :
      if(isNewCandle)CheckForMaTradeLong();
      if(isNewCandle)CheckForMaTradeShort();
 
Grazie WHRoeder - buon consiglio!