Chiusura di mezzi lotti. - pagina 8

 
DomGilberto:

Questo viene stampato nel Journal durante il mio ciclo for, dove, nel caso di un ordine di acquisto pendente, se il 60 EMA è > dell'OrderStopLoss, chiuderà l'ordine pendente, ne aprirà uno nuovo con un nuovo SL (che è dietro il 60EMA), regolerà il take profit per ottenere la ricompensa 1:2, e cambierà i lotti relativi allo stop in punti e il mio profilo di rischio (diciamo 2%).

Quindi, quando tutto questo viene fatto, la variabile personalizzata "Current Lots" che è "LotSize" all'interno di OrderSend funziona, sta inviando una dimensione di lotto che non è corretta per il server a ricevere? "0.18215"? Potrebbe essere un problema, nonostante gli ordini vengano effettivamente inviati comunque - questa domanda è più in relazione a "potrebbe essere questa la ragione per cui non posso chiamare "OrderType==OP_BUY"?

Dovresti risolverlo, convalidare la dimensione del lotto nello stesso modo che hai già . . . potresti anche codificare una funzione separata per farlo sulla base del codice che hai già . . . per esempio:

double ValidateLots(double PositionSize)
   {
   double LotStep, MinLot;

   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   MinLot  = MarketInfo(Symbol(), MODE_MINLOT);
   
   return( MathFloor(PositionSize / LotStep) * LotStep);
   }


Invece di usare LotSize nel tuo OrderSend() useresti ValidateLots(LotSize)

Dubito che questo sia la causa del tuo problema però . . .

 
Hmm - sì, ci ho appena giocato. Sembra che l'ordine venga semplicemente inviato, dato che il server permette solo 0,00 (2 cifre decimali). Quindi le cifre rimanenti sono quasi irrilevanti.

Argh! Così frustrante lol - bloccato su questo da troppo tempo ormai :(

Non riesco a capire perché questo sia un problema e non posso selezionare un "OP_BUY"... So che probabilmente ho esaurito questo argomento, ma qualsiasi ultima pugnalata nel buio sarebbe davvero apprezzata - grazie anche per l'aiuto!
if (direction==0){ <<<//--Buy--// This gets called upon if all the set-up is apparent.
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10; //--// (in process of changing at the moment)
      
      if(OpenOrdersThisPair(Symbol())==0)  //--//<--- No order open = then open one...
      {
      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
      
         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips) //--//<<-- This will 99% of the time be true and the order above will be cancelled and looped in the "for" until the order is triggered.
         {
         
               for(int b=OrdersTotal()-1; b >=0; b--) 
                  {
    
                     if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==true)
                     {
                     Print(" Stop loss value for the order is ", OrderStopLoss());
                     }
    
                     else if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==false)
                     {
                     Print(" OrderSelect failed error code is ",GetLastError());
                     }
                     if(OrderMagicNumber()==MagicNumber)
                        if(OrderSymbol()==Symbol())
                           if(OrderType()==OP_BUYSTOP)
                              if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)
                                //if(OpenOrdersThisPair(Symbol())==1)
                                 { 
                                 DeleteOrder = OrderDelete(OrderTicket());
                                 if(DeleteOrder!=TRUE)Print("Buy Delete Order Last Error = ", GetLastError());
                                 }
                                  
                                 if(OpenOrdersThisPair(Symbol())==0)//<<-- If there are no open orders = place a new order.
                                  { 
                                  int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); 
                                  if(NewBuyOrder == -1)Print("New Buy Order Last Error = ", GetLastError());
                                  if(NewBuyOrder > 0)Print("NEW BUY ORDER:- Lots to open: ", DoubleToStr(LotSize, Digits), " Entry Price: ", DoubleToStr(buyPrice, Digits), 
                                  " Buy Stop Loss: ", DoubleToStr(bsl, Digits), " Buy Take Profit: ", DoubleToStr(btp, Digits), " Magic Number is: ", DoubleToStr(MagicNumber, Digits));  
                                  } 
                  }
             } 
       }
 
DomGilberto:
Hmm - sì, ci ho appena giocato. Sembra che l'ordine venga semplicemente inviato come il server permette solo 0.00 (2 cifre decimali). Quindi le cifre rimanenti sono quasi irrilevanti.

Argh! Così frustrante lol - bloccato su questo da troppo tempo ormai :(

Non riesco a capire perché questo sia un problema e non posso selezionare un "OP_BUY"... So che probabilmente ho esaurito questo argomento, ma qualsiasi ultima pugnalata nel buio sarebbe davvero apprezzata - grazie anche per l'aiuto!

Penso che tu debba mostrare tutto il tuo codice . . .

Vedo alcuni problemi qui:

      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
       //  where are you checking the return value from the OrderSend() and reporting errors ?

         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)    //  where is the OrderSelect() ?
 
Tutto il codice non ci sta qui? L'ho messo su pastebin però?

-http://pastebin.com/eaY1wKbN

Scusa per la sintassi - un po' più difficile da vedere tutto, ma non hanno MQL4? Quindi mettilo sotto C++
 
DomGilberto:
Tutto il codice non ci sta qui? L'ho messo su pastebin però?

-http://pastebin.com/eaY1wKbN

Scusa per la sintassi - un po' più difficile da vedere tutto, ma non hanno MQL4? Quindi mettilo sotto C++

Nessun problema . . .

Quando fai questo...

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+

   if(OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1 && OrderType()==OP_BUY)
     {

Il tuo OrderSelect() fallirà se il tuo OrderTicket() fallisce, a meno che tu non abbia già un ordine selezionato. Hai davvero bisogno di questo codice? In seguito hai un ciclo in cui selezioni gli ordini e controlli il loro simbolo, il loro Magic Number e il loro tipo...

Anche questo è da sistemare...

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())

               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

         if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
           {
            Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
            bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
            if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
           }

. . . aggiungi delle parentesi graffe. . .

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

               if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
                 {
                 Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
                 bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
                 if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
                 }
              }
 

Ok - ho fatto più stampe per avere un po' di chiarezza su ciò che viene fatto e su quale punto. L'ho incollato qui sotto.

La linea dove dice "Order Select for closing:-..." è quello che viene selezionato al punto "Close OP_BUY Half Lots @ 1:1 Function" che hai chiesto sopra. Sembra che il numero di ticket sia diverso in questo punto di selezione? Ho eliminato la parte "...&& OrderType()==OP_BUY", poiché sembra stampare il resto quando questa parte non è nella dichiarazione "if"... Questo dà un po' più di chiarezza?

"Primo ordine di acquisto piazzato:-" è la prima funzione OrderSend che passa all'inizio
"Checking Buy Order:-" è quella all'interno del ciclo for che cancella e riapre l'ordine in sospeso se la MA è > l'OrderStopLoss().
"NUOVO ORDINE DI ACQUISTO:-" è il nuovo ordine che viene inserito all'interno del ciclo for.
"Order Select for closing:-..." - come già detto sopra, questa è la parte che viene selezionata per chiudere metà dei lotti.

Scusa se ti ho confuso, dato che ho appena aggiunto queste parti - non le vedrai nel link pastebin di cui sopra... solo semplici funzioni di stampa :)

2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Current Bid: 1.35972 FirstTarget_Buy: 1.37931
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This is the price where half the lots will close.
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Lots Open = 0.18
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Ticker Number = 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Select for closing:- Lots open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: NEW BUY ORDER:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: open #9 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: delete #8 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Checking Buy Order:- Lots to open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: First Buy Order placed:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 7
 
DomGilberto:

Ok - ho fatto più stampe per avere un po' di chiarezza su ciò che viene fatto e su quale punto. L'ho incollato qui sotto.

La linea dove dice "Order Select for closing:-..." è quello che viene selezionato al punto "Close OP_BUY Half Lots @ 1:1 Function" che hai chiesto sopra. Sembra che il numero di ticket sia diverso in questo punto di selezione? Ho eliminato la parte "...&& OrderType()==OP_BUY", poiché sembra stampare il resto quando questa parte non è nella dichiarazione "if"... Questo dà un po' più di chiarezza?

"Primo ordine di acquisto piazzato:-" è la prima funzione OrderSend che passa all'inizio
"Checking Buy Order:-" è quella all'interno del ciclo for che cancella e riapre l'ordine in sospeso se la MA è > l'OrderStopLoss().
"NUOVO ORDINE DI ACQUISTO:-" è il nuovo ordine che viene inserito all'interno del ciclo for.
"Order Select for closing:-..." - come già detto sopra, questa è la parte che viene selezionata per chiudere metà dei lotti.

Scusa se ti ho confuso, dato che ho appena aggiunto queste parti - non le vedrai nel link pastebin di cui sopra... solo semplici funzioni di stampa :)


Prova l'allegato . . . è la mia migliore ipotesi su quello che stai cercando di fare . . .
File:
dom.mq4  24 kb
 

Ah, fantastico - grazie. È un grande passo nella giusta direzione. Penso che siccome è all'interno di un ciclo for, vuole chiudere metà e metà e metà @ il prezzo... Invece di farlo solo una volta? Non solo, ma sembra che non chiuda a metà non appena il prezzo >= al prezzo di uscita che voglio, invece va oltre, e poi quando il prezzo oscilla di nuovo più in basso nel prezzo di uscita che voglio, si chiude allora - strano... Apprezzo la vostra pazienza nell'aiutarmi! Molto grato per il vostro tempo!


AGGIORNAMENTO: Inoltre, ho appena scoperto che se cambio le proprietà dell'esperto (extern int) prima di lanciare strategy tester, allora la metà di chiusura non funziona affatto - le cose che hanno effetto sulla metà di chiusura sono "MA_PadAmount" questo è quanti punti voglio aggiungere come pad allo stop loss che segue in pips, e "OrderPrice_PadAmount" che mi permette di specificare quanti pips posso mettere come pad sul prezzo di entrata degli ordini...

 
DomGilberto:
Ah, fantastico - grazie. È un grande passo nella giusta direzione. Penso che siccome è all'interno di un ciclo for, vuole chiudere metà e metà e metà @ il prezzo... Invece di farlo solo una volta? Non solo, ma sembra che non chiuda a metà non appena il prezzo >= al prezzo di uscita che voglio, invece va oltre, e poi quando il prezzo oscilla di nuovo più in basso nel prezzo di uscita che voglio, si chiude allora - strano... Apprezzo la vostra pazienza nell'aiutarmi! Molto grato per il vostro tempo!
Non è il ciclo for, è solo che non ha modo di sapere che la metà è già stata chiusa... come hai pensato di gestire questo?
 
Sì - l'ho letteralmente capito quando ho rimosso il ciclo for. Ho ragione nel dire che se tengo traccia del numero OrderTicket da quando viene selezionato per la prima volta, una volta che OrderClose ha fatto la sua cosa e restituisce true, allora potrei verificare questo con il numero OrderTicket in quanto saranno diversi - rompendo così il ciclo e aspettare fino a quando un altro nuovo ordine passa?

Non sono del tutto sicuro di come scriverlo, ma è più o meno sulle linee giuste?
Motivazione: