Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 116

 
novichok2018:

Grazie. La pausa sembra aver aiutato. Vediamo cosa succede dopo.

No, non ha aiutato molto. Funziona solo se viene aperto un tipo di posizione. Se, per esempio, una posizione Sell viene aperta e non è ancora chiusa, e contemporaneamente una posizione Buy viene aperta e chiusa, la posizione Sell non vede le condizioni per essere chiusa prima che un'altra posizione Sell si apra e si chiuda (secondo le sue condizioni). E se BAY apre e chiude di nuovo, manca di nuovo le sue condizioni di chiusura. Ho provato a determinare la presenza diposizioni aperte dopo la chiusura di BAY usando la funzione ExistPositions() di I.Kim, ma non capisco dove inserirla e dove mettere Print per controllare l'esecuzione. Qualsiasi indizio.

 
novichok2018:

No, non ha aiutato molto. Funziona solo se viene aperto lo stesso tipo di posizione. Se, per esempio, prima viene aperta una posizione Sell e non ancora chiusa, e allo stesso tempo viene aperta e chiusa una posizione Buy, allora la posizione Sell non vede le sue condizioni di chiusura fino a quando un'altra posizione Sell non si apre e chiude (secondo le sue condizioni). E se BAY apre e chiude di nuovo, manca di nuovo le sue condizioni di chiusura. Ho provato a determinare la presenza diposizioni aperte dopo la chiusura di BAY usando la funzione ExistPositions() di I.Kim, ma non capisco dove inserirla e dove mettere Print per controllare l'esecuzione. Puoi darmi un suggerimento?

Nessuno conosce la soluzione? Io no.

 
novichok2018: Nessuno conosce la soluzione? Io no.

Mi sono collegato al forum - vedo che stai parlando da solo... Dov'è l'inizio della vostra conversazione e di cosa si tratta - difficile da capire. Per eseguire il debug di un programma, è molto più conveniente usare Alert invece di Print - viene mostrato subito sullo schermo. Questi Alert sono posizionati prima che la condizione if sia controllata. Un altro metodo di debugging con una matita - passare attraverso il programma come dovrebbe essere eseguito, e scrivere i valori delle variabili. Se cambia - cancella il vecchio valore e scrivi quello nuovo. Questo è il modo in cui si faceva prima. Ora MetaEditor ha un debugger, dove è possibile monitorare i valori delle variabili. Le costruzioni più semplici dovrebbero essere controllate separatamente scrivendo uno script

 
novichok2018:

Nessuno conosce la soluzione? Io no.

Prova in questo modo:

//+------------------------------------------------------------------+
void OnTick()
  {
   int total=OrdersTotal();
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(TimeCurrent()>OrderOpenTime()+100)
           {
            switch(OrderType())
              {
               //_______________________________________________________________________
               case OP_BUY:
                 {
                  if(OrderMagicNumber()==101 && MathAbs(WPR1)<5)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==111 && MathAbs(WPR1)<20)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
               //_______________________________________________________________________                 
               case OP_SELL:
                 {
                  if(OrderMagicNumber()==222 && MathAbs(WPR1)>97.55)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==201 && MathAbs(WPR1)>96)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
              }
           }
        }
     }
  }
//_______________________________________________________________________
void ClosePosBySelect(int slip,color col) 
  {
   RefreshRates();
   if(OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), slip, col);
   if(OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), slip, col);
  }
//_______________________________________________________________________
 
da dove prende i suoi dati iCustom?
 
Igor Makanu:

Prova in questo modo:

Grazie, l'ho provato - non chiude nessuna posizione anche dopo alcune regolazioni, quindi il compilatore non giura.

 
STARIJ:

Mi sono collegato al forum - ti vedo parlare da solo... È difficile capire da dove sei partito e di cosa stai parlando. Per il debug del programma è più conveniente usare Alert invece di Print - viene mostrato subito sullo schermo. Questi Alert sono posizionati prima che la condizione if sia controllata. Un altro metodo di debugging con una matita - passare attraverso il programma come dovrebbe essere eseguito, e scrivere i valori delle variabili. Quando cambia - cancella il vecchio valore e scrivi quello nuovo. Questo è il modo in cui si faceva prima. Ora MetaEditor ha un debugger, dove è possibile monitorare i valori delle variabili. I costrutti più semplici devono essere controllati separatamente scrivendo uno script

Grazie per le raccomandazioni, ma per la mia situazione non sono del tutto corrette. Solo per chiarire, qui sotto c'è il codice di una funzione di chiusura personalizzata

 

Non funziona correttamente - lachiusura delle posizioniavviene alle condizioni della prima posizione aperta. Cioè, se prima è stata aperta una posizione Buy o Sell con la Condizione 1 e poi è stata aperta una seconda posizione con la Condizione 2, la condizione di chiusura viene ignorata e anche la seconda posizione viene chiusa con la Condizione 1 nonostante un numero magico diverso.

Ho applicato l'interruzione dopo la chiusura dell'ordine ma la soluzione è stata mezza:solo se viene aperta una posizione dello stesso tipo. Se, per esempio, una posizione Sell è stata aperta per prima e non è stata ancora chiusa, mentre una posizione Buy viene aperta e chiusa, la posizione Sell non vede alcuna condizione per essere chiusa fino a quando un'altra posizione Sell non viene aperta e chiusa (secondo le sue condizioni). E se BAY apre e chiude di nuovo, manca di nuovo le sue condizioni di chiusura. Quindi cosa fare?

void ClosePoz()
  { RefreshRates();
         double WPR0 = iWPR(NULL,0,bars,0);
         double WPR1 = iWPR(NULL,0,bars,1);
         bool rez = false;
           
  int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
              if(TimeCurrent()>OrderOpenTime()+300)
               {
               if(OrderMagicNumber==101 || OrderMagicNumber==102 || OrderMagicNumber==103 || OrderMagicNumber==104)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 break; 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<17) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break; 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>97)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==202)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
                
                } 
              }
       break;  
      }
  }
 
Mickey Moose:
da dove prende i suoi dati iCustom?

dai buffer dell'indicatore personalizzato, pratica, per esempio sulla MA

novichok2018:

Ho applicato la pausa dopo la chiusura di un ordine ma la soluzione è a metà:solo se viene aperta una posizione dello stesso tipo. Se, per esempio, una posizione BOY è aperta e non è ancora stata chiusa, mentre una posizione BAY viene aperta e chiusa, la posizione BAY non vede alcuna condizione per essere chiusa fino a quando un'altra posizione BAY viene aperta e chiusa (alle sue stesse condizioni). E se BAY apre e chiude di nuovo, manca di nuovo le sue condizioni di chiusura. Quindi cosa fare?

prova a sostituire break con continue

è strano che il mio esempio di codice non chiuda nulla, forse riguarda la normalizzazione dei prezzi

 
Igor Makanu:


prova a sostituire break con continue


Sostituito. Errore maledetto 138(requotes). Poi ho dato la pausa indietro, ed è di nuovo 138. Strano, forse non l'ho notato prima.

 
Igor Makanu:

dai buffer dell'indicatore personalizzato, fare pratica con la MA, per esempio


È dal campo che appare nella finestra dei dati del terminale?