Chiusura di mezzi lotti. - pagina 3

 
DomGilberto:

MathFloor arrotonda i decimali al numero INTERO più vicino?

MathFloor() fa quello che dice nella documentazione. . . "La funzione MathFloor restituisce un valore numerico che rappresenta il più grande intero che è minore o uguale a x."

DomGilberto:


FirstTarget ha senso come parametro personalizzato all'interno di "OrderClose()" - Supponendo che "sizeClose" sia corretto? (vedere il codice citato)

No . . . avete questo:

FirstTarget = OrderTakeProfit()-OrderOpenPrice()/2+OrderOpenPrice();

// meaning this

FirstTarget = OrderTakeProfit() - ( OrderOpenPrice() / 2 ) + OrderOpenPrice();

quando probabilmente intendi questo . . .

FirstTarget = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 ) ;

Usa le parentesi (e gli spazi) per rendere le cose chiare e non ambigue.

DomGilberto:


Il tuo codice non ha aiutato - mi dispiace.

Perché? È sbagliato? In che modo?

DomGilberto:


Si possono stampare variabili personalizzate? Se è così, devo averlo fatto male perché non appare nel diario.

Sì, puoi stampare qualsiasi variabile. Cosa stai facendo? Mostra il tuo codice.

 
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }
   } 
     
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_SELLSTOP)
    {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);
      
      double FirstTarget_Sell = OrderOpenPrice() - ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
       
       if (half < minLot) half = Lots;
       half=Lots/2;
       OrderClose(OrderTicket(),half,FirstTarget_Sell,3,DarkViolet); 
       }
    } 


Per quanto riguarda la stampa di variabili personalizzate, come potrei farlo per "FirstTarget_Buy"?

Ho intenzione di passare del tempo passando attraverso tutto il mio codice e stampando molto - capisco come farlo con bools e ints (integer -1 fallisce e bool è una dichiarazione vera o falsa - facile.) ma non capisco come farlo quando si assegnano funzioni ad una variabile personalizzata?

Grazie per aver fatto luce sulla formula "FirsTarget" sopra! Scusa, volevo dire che il tuo codice non mi ha aiutato nel senso che non sto capendo come mettere insieme la formula... Lo trovo davvero contro intuitivo - Avresti pensato che chiamare "OrderSelect" ti avrebbe permesso semplicemente di vedere quale fosse la dimensione del lotto su quel tickorder... e poi semplicemente dividerlo...

Scusa se mi presento come un completo idiota!

 
DomGilberto:

Scusa se mi sono presentato come un completo idiota!

Niente affatto, devi solo trovare il tuo punto cieco e illuminarlo, una volta che l'hai fatto ti chiederai perché l'hai trovato così difficile, tutto è facile quando sai come farlo.

DomGilberto:

Per quanto riguarda la stampa di variabili personalizzate, come dovrei fare per "FirstTarget_Buy"?

Ho intenzione di passare del tempo passando attraverso tutto il mio codice e stampando molto fuori - capisco come farlo con bools e ints (integer -1 fallisce e bool è una dichiarazione vera o falsa - facile.) ma non capisco come farlo quando si assegnano funzioni ad una variabile personalizzata?

Come questo . . . nota anche il commento sulle parentesi graffe
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );

      Print("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy, Digits) );   // prints FirstTarget_Buy with the same number of digits as the current symbol
         {                                                                                        // why this brace ?   
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }                                                               // why this brace ?  
   } 

DomGilberto:

Volevo dire che il tuo codice non mi ha aiutato nel senso che non sto capendo come mettere insieme la formula... Lo trovo davvero contro intuitivo - Avresti pensato che chiamare "OrderSelect" ti avrebbe permesso semplicemente di vedere quale fosse la dimensione del lotto su quel tickorder... e poi semplicemente dividerlo...

Puoi semplicemente OrderSelect l'ordine, usare OrderLots() e dividere per due. . . puoi farlo, e in molte situazioni funzionerà. Io scrivo il codice per tutti i casi che posso prevedere in modo da non doverlo continuamente correggere quando si rompe...

Se la dimensione della tua posizione è di 2.0 lotti; questo diviso per due è 1.0 lotti e questo funzionerà . . .

Se la dimensione della tua posizione è 0.3 lotti; questo diviso per due è 0.15 lotti e questo sarà una dimensione di posizione non valida se MODE_LOTSTEP è 0.1 . . . puoi usare 0.1 o 0.2 NON 0.15 quindi devi codificare questo controllo e regolazione.


Quello che hai qui non funzionerà in tutti i casi ...

double Lots = OrderLots(); 
      

         
         half = Lots / 2; 
 

Ahhhh! Ho appena trascorso gli ultimi 15-20 minuti a smanettare con le stampe dappertutto - sto iniziando a capire dove sto sbagliando. In pratica sto selezionando l'ordine PENDING... TUTTAVIA, poiché si tratta di un ordine pendente, nel momento in cui lo seleziono, c'è un'alta possibilità che gli OrderLots, lo stop e i target siano cambiati, quindi devo metterlo in un ciclo per sincronizzarlo con il modo in cui i miei ordini pendenti vengono costantemente calcolati prima che si attivino.

Quel maledetto doubletostr :P - Punto su RaptorUK! Ora vedo che è calcolato correttamente, grazie alla tua correzione :)

Penso di sapere come fare la maggior parte di esso ora - Solo per curiosità, quale dichiarazione "if" funzionerebbe per chiamare SOLO l'ordine che è stato TRIGGERATO. Al momento, ho chiamato quando ho un ordine a mercato aperto, ma sto cercando di capire come chiamare quando l'ordine pendente è stato attivato?

Il codice qui sotto e la corrispondente dichiarazione "if" sembrano chiamare solo gli ordini pendenti aperti. Voglio solo un modo per "andare a" una specifica funzione personalizzata (void per esempio) sulla base del fatto che un ordine è stato attivato? (se questo ha senso!)

Grazie per avermi chiarito molte cose :)

int OpenOrdersThisPair(string pair)
{
   int total=0;
      for(int i=OrdersTotal()-1; i >= 0; i--)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==pair) total++;
         }
         return (total);
}         

if(OpenOrdersThisPair(Symbol())>0)
 
DomGilberto:

Ahhhh! Ho appena trascorso gli ultimi 15-20 minuti a battere stampe dappertutto - sto iniziando a capire dove sto sbagliando.

Facile quando sai come

DomGilberto:


Penso di sapere come fare la maggior parte di esso ora - Solo per curiosità, quale dichiarazione "if" funzionerebbe per chiamare SOLO l'ordine che è stato TRIGGERATO. Al momento, l'ho chiamato quando ho un ordine a mercato aperto, ma sto cercando di capire come chiamare quando l'ordine pendente è stato attivato?

Quando un ordine pendente è stato attivato, diventerà un OP_BUY o OP_SELL, quindi...

if(OrderType() == OP_BUY || OrderType() == OP_SELL)
   { 
   
   }

Un consiglio, usa più spazi . . . quando ottieni un errore di divisione per zero e vuoi trovare dove sta succedendo è facile cercare lo spazio/spazio e trovare solo le tue divisioni invece di tutti i tuoi commenti . . . quindi uso gli spazi intorno a = + - / % ecc.

 
Ah, naturalmente (facepalm!)

Buon suggerimento - lo farò! Grazie per il tuo aiuto :) Vi posterò se riuscirò a farlo!
 
Ok, sono tornato! ... Non è una buona notizia però - ho provato e riprovato diverse variazioni di codice senza fortuna. Questo è il punto in cui mi trovo ora.

Non sto ottenendo alcuna informazione riguardo alle stampe? Assolutamente niente viene fuori nel Journal. Presumo che questo sia dovuto al fatto che non viene selezionato nulla per quanto riguarda l'OrderType fin dalla prima istruzione "if"? Da quello che posso vedere qui sul codice, avrei pensato che non sono molto lontano, almeno...?
if(OrderType() == OP_BUY ){
   
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy)            
         
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
            Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
            }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
 
DomGilberto:
Ok, sono tornato! ... Non è una buona notizia però - ho provato e riprovato diverse varianti di codice senza fortuna. Questo è il punto in cui mi trovo ora.

Non sto ottenendo alcuna informazione riguardo alle stampe? Assolutamente niente viene fuori nel Journal. Presumo che questo sia dovuto al fatto che non viene selezionato nulla per quanto riguarda l'OrderType fin dalla prima istruzione "if"? Da quello che posso vedere qui sul codice, avrei pensato che non sono molto lontano, almeno...?

Come stai selezionando l'ordine prima di fare questo?

if(OrderType() == OP_BUY ){

Hai ancora problemi qui

      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());  //  OrderSelect has failed,  why do you continue . . . 
            }
            if(OrderMagicNumber()==MagicNumber)                            //  . . . to this line ?
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy) 
 

Perché non . . .

for( int c = OrdersTotal()-1; c >= 0; c-- )
   {
   if( OrderSelect(c, SELECT_BY_TICKET, MODE_TRADES) )
      {
      Print("Order Ticker Number = ",OrderTicket());
      Print("Order Lots Open = ", OrderLots());
      } 
   else 
      {
      Print("Order Select returned the error of ", GetLastError()); 
      continue;                                                        // try next order position in the loop
      }
   if(OrderMagicNumber() == MagicNumber)    
      if(OrderSymbol() == Symbol())
         if(OrderType() == OP_BUY)
            if(OpenOrdersThisPair(Symbol()) == 1) 
 
Non posso credere che sto facendo questi errori da principiante... Mi dà fastidio! Sì, l'ho fatto stampare ora e ho selezionato l'ordine. Questo è il codice che funziona in termini di stampa - i lotti non vengono ancora chiusi però? Ho anche incollato i messaggi del diario qui sotto.
  if(OrderSelect(OrdersTotal(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1){
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
           Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
         }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else{
           Print("Order Select returned the error of ", GetLastError()); // Order Select does not seem to want to work?
            continue;
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: Order Select returned the error of 0    // Not sure what is going on here?		
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000           // This is the right calculation based 
                                                                                                                      // upon the total lots opened on a pending order - to half.
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931                // This price is also correct.


Motivazione: