Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1078

 
Motzaart:

Pomeriggio.

In un Expert Advisor multivaluta, ho bisogno di chiudere un ordine pendente piazzato contro un profitto quando scatta una posizione aperta.

In questo momento, quando chiudo un ordine pendente in profitto, tutti gli ordini pendenti per tutte le valute vengono chiusi.

Come cambiare il codice in modo che solo l'ordine pendente relativo a una coppia di valute si chiuda e il resto rimanga aperto?

Cosa devo cambiare in questo codice?

Mn in questo codice è un numero magico di un ordine pendente BUY_STOP o SELL_STOP.

La logica è che quando una posizione aperta viene chiusa a Take Profit, questo numero magico viene lasciato e si suppone che il comando di cancellazione venga eseguito.

Questo funziona quando si testa ogni coppia. Tuttavia, quando si lavora con altre valute, tutti gli ordini piazzati su tutte le coppie vengono cancellati.

Per favore, aiutate chi è in grado di farlo.

Capisco che nessuno dovrebbe preoccuparsi di questo problema, ma forse qualcuno ha un modello pronto?

Te ne sarei molto grato.

Ho dovuto copiare il codice nell'editor e fare un po' di styling normale (Ctrl+<) per capire cosa hai combinato lì.

Allora: ho commentato nel codice ciò che era incasinato lì:

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   operation=0; // неиспользуемая переменная
     { // лишняя скобка
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         OrderSelect(i, SELECT_BY_POS); // нет проверки на результат выделения ордера в списке, и если ордер не выбран, то всё последующее вызовет ошибки
         int  type   = OrderType();
         bool result = false;
         switch(type)
           { // К СВЕДЕНИЮ - ВСЕ ОПЕРАТОРЫ break ЗАКОММЕНТИРОВАНЫ, А ЗНАЧИТ - ВСЕ СТРОКИ КОДА ОПЕРАТОРА switch ВЫПОЛНЯЮТСЯ ВСЕГДА
            case OP_BUYSTOP   : // Если выбран отложенный BuyStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red);  //break;
            case OP_SELLSTOP  : // Если выбран отложенный SellStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red);   //break;
               // Независимо от типа выбранного ордера (отложенный или позиция) удаляем его как отложенный, что для позиции вызовет ошибку
               result = OrderDelete(OrderTicket());  //break;
           }
        }
     } // лишняя скобка
  }
//+------------------------------------------------------------------+

Di conseguenza, il vostro codice fa questo, cioè è equivalente a questo codice:

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   bool result=false;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS)) {}
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, clrRed);
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, clrRed);
      result = OrderDelete(OrderTicket());
     }
  }
//+------------------------------------------------------------------+

Ora chiedetevi: cosa volevate ottenere da questo?

 
Artyom Trishkin:

Per capire cosa hai incasinato lì, ho dovuto copiare il codice nell'editor e fare uno styling adeguato (Ctrl+<).

Quindi: commentate nel codice quello che avete incasinato lì:

Di conseguenza, il vostro codice fa questo, cioè è uguale a questo codice:

Ora chiedetevi: cosa volevate ottenere da questo?

OK.

if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?

qui:

extern int mn;//магический номер открытой позиции
int Mn=10*mn; //магический номер отложенного ордера
int TimFr1=72,TimFr2=24,TimFr3=24;

int start()
 {if(Symbol()=="EURUSD")mn=1;if(Symbol()=="GBPUSD")mn=2;if(Symbol()=="USDCHF")mn=3;if(Symbol()=="USDJPY")mn=4;
  if(Symbol()=="USDCAD")mn=5;if(Symbol()=="EURGBP")mn=6;if(Symbol()=="AUDUSD")mn=7;if(Symbol()=="NZDUSD")mn=8;
  if(Symbol()=="EURJPY")mn=9;if(Symbol()=="EURCHF")mn=10;

Quando viene aperta una posizione (OP_BUY o OP_SELL ), piazziamo simultaneamente ordini pendenti (OP_SELLSTOP e OP_BUYSTOP), rispettivamente.

Quando si chiude una posizione aperta a take profit, l'ordine pendente corrispondente deve essere cancellato. Questo algoritmo viene applicato a tutte le coppie di valute.

Gli altri ordini pendenti piazzati su altre valute dovrebbero rimanere.

 

Buona giornata a tutti voi!

C'è un indicatore MTF_RSI che sta commutando

input ENUM_TIMEFRAMES      TimeFrame   =  0;

Potete dirmi se è possibile impostare il cambio automatico del TimeFrame quando si cambia grafico?

Qualcosa come

if(TimeFrame=Period())
   TimeFrame="Следующий период";        
 
MakarFX:

Buona giornata a tutti voi!

C'è un indicatore MTF_RSI che sta commutando

Potete dirmi se è possibile impostare il cambio automatico del TimeFrame quando si cambia grafico?

Qualcosa del genere

Create una struttura o un array multidimensionale e fatelo girare sulla dimensione desiderata, se il criterio è soddisfatto, lavorate con una colonna (ogni colonna è responsabile del suo tempo), altrimenti con un'altra colonna, e questo è tutto. Il programma stesso ha accesso a tutti i timeframes contemporaneamente, quindi quello che scrivi è possibile, ma l'implementazione è molto estesa e non puoi vedere questa quantità di lavoro sul forum, perché è molto estesa.

 
Seric29:

Creare una struttura o un array multidimensionale

Grazie.

 

Perché questo codice non funziona?

typedef double(*CenBr)(string,int,int);CenBr cn_br[4];//глобально
//В Ините пытюсь сохранить указатель на функцию iOpen и ничего не выходит
cn_br[0]=iOpen;

Funziona con funzioni semplici, ma c'è qualcosa di strano.

 
MakarFX:

Grazie.

создаём массив double BarOCLH[1000][2][4]
далее сохраняем цену открытия 0 вого бара дневного таймфрейма
BarOCLH[0,0,0]=iOpen ();
далее сохраняем цену открытия 0 вого бара часового таймфрейма
BarOCLH[0,1,0]=iOpen ();и т.д ну а дальше критерируйте с каким столбцом работать
 
Seric29:
Stai parlando con me?
 
MakarFX:
Stai parlando con me?

Sì a te. Dovrete lavorare attraverso il gioco con tempistiche su ogni dettaglio in ogni ciclo e in ogni funzione. Questo è il motivo per cui raccomando di usare gli array multidimensionali.

 
Seric29:

Sì a te. Dovrete lavorare attraverso il gioco con tempistiche su ogni dettaglio in ogni ciclo e in ogni funzione. Questo è il motivo per cui raccomando di usare gli array multidimensionali.

Questo problema si risolve più facilmente:

   switch(period)
     {
      case PERIOD_M1  : TimeFrame = PERIOD_M5;  break;
      case PERIOD_M5  : TimeFrame = PERIOD_M15; break;
      case PERIOD_M15 : TimeFrame = PERIOD_M30; break;
      case PERIOD_M30 : TimeFrame = PERIOD_H1;  break;
      case PERIOD_H1  : TimeFrame = PERIOD_H4;  break;
      case PERIOD_H4  : TimeFrame = PERIOD_D1;  break;
      case PERIOD_D1  : TimeFrame = PERIOD_W1;  break;
      case PERIOD_W1  : TimeFrame = PERIOD_MN1; break;
      case PERIOD_MN1 : TimeFrame = PERIOD_MN1; break;
      default :        return(INIT_FAILED);
     }