[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 497

 
Si prega di consigliare come aprire un ordine su una nuova barra solo una volta ????
 

incorporare il codice nell'EA, avevo qualcosa di simile fino a quando non l'ho cancellato, stavo usando il timeframe orario

orderelect - seleziona l'ultimo ordine nella storia

prendere il tempo della sua chiusura e tirare fuori l'ora di chiusura

e prima di aprire l'ordine, impostare una condizione che l'ora corrente NON sia uguale all'ora di chiusura dell'ordine dalla storia

 

Per favore aiutatemi con questo problema, la mia variabile TP è azz erata dopo il secondo aggiornamento del prezzo, cioè, l'advisor apre un ordine, e TP e Bid non sono entrambi uguali a zero, poi il prezzo viene aggiornato di nuovo e TP è zero, anche se non c'è un tale comando nel codice, ho avuto un problema con il tirare su SL, ma ora risulta che il problema è nella definizione di TP

int start()
{
//----
double TP;
double SL;
if (OrdersTotal()==0)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,Bid+4*Point);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
TP=OrderTakeProfit();
}
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
if (OrdersTotal()>0)
{
if (TP-Bid<3*Point)
{
Alert ("Approaching TP by 1 or 2");
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
}
}
//----
return(0);
}

 
LazarevDenis:

Per favore aiutatemi con questo problema, la mia variabile TP è azzerata dopo il secondo aggiornamento del prezzo, cioè, l'EA apre un ordine e visualizza i valori di TP e Bid, entrambi non sono uguali a zero, poi il prezzo viene aggiornato di nuovo e TP è zero, anche se nel codice, nessun comando del genere, ho avuto un problema con il tirare SL in alto, ma ora si scopre che il problema è nella definizione di TP

double TP, SL;


int start()
{
//----

if (OrdersTotal()==0)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,Bid+4*Point);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
TP=OrderTakeProfit();
}
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
if (OrdersTotal()>0)
{
if (TP-Bid<3*Point)
{
Alert ("Приблизился к ТП на 1 или 2");
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
}
}
//----
return(0);
}
Prova in questo modo...
 
VOLDEMAR:
Si prega di consigliare come aprire un ordine su una nuova barra solo una volta ????

Leggi qui: https://www.mql5.com/ru/forum/134437
 
Cmu4, grazie mille, sei stato molto utile
 

Ciao a tutti!

Ci sono due segnali nella strategia: uno primario e uno secondario. Un trade si apre quando il secondo segnale appare non più tardi di 12 ore dopo. Domanda: Come posso insegnare al mio Expert Advisor a non reagire al segnale, se appare dopo 12 ore? Per favore, se potete dare un esempio concreto di codice

 
demlin:

Ciao a tutti!

Ci sono due segnali nella strategia: uno primario e uno secondario. Un trade viene aperto quando il secondo segnale appare non più tardi di 12 ore dopo. Domanda: Come posso insegnare al mio Expert Advisor a non reagire al segnale, se appare dopo 12 ore? Per favore, se potete darmi un esempio del codice


Ciao Dmitry. Da parte mia sono pronto ad offrirvi la seguente variante. Per analogia, vedi l'attivazione dei criteri di trading di questo articolo - ci sono anche due segnali - cioè - vedi dopo la seconda figura "La prima cosa da aspettare sul grafico DeMarker è quando il DeMarker incrocia la linea MA veloce e lenta intorno a 0,7 per una posizione short. Questo è il primo segnale preliminare. Poi aspettiamo l'attraversamento delle linee MA stesse. Questo è il segnale principale, dopo il quale si possono prendere le letture dell'indicatore Taichi. Se le linee MA non sono attraversate, è considerato un falso segnale e il movimento del prezzo continuerà. Ecco come è implementato nel mio codice - nell'inclusione inclusa dei gufi che sono responsabili dell'attivazione dei criteri di trading.

Il trucco principale è quello di lavorare attraverso i due sotto (alla fine) l'inclusione impostando e resettando le bandiere quando l'uno o l'altro criterio di commercio è innescato.

//--------------------------------------------------------------------
// Criterion.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления торговых критериев.
// Возвращаемые значения:
// 10 - открытие Buy  
// 20 - открытие Sell 
// 0  - значимых критериев нет
// 
//--------------------------------------------------------------- 2 --
// Внешние переменные:
extern string A5 = "Параметры";
//extern int       Period_K = 5;            // Период K
//extern int       Period_D = 3;            // Период D
//extern int       Slowing = 3;             // Замедление

extern int Tenkan=9;
extern int Kijun=26;
extern int Senkou=52;
extern int FlatSE=7;

extern int DeMarker=25;
extern int FastMA=14;
extern int SlowMA=25;
extern double DeMarker_OpenLevel_Sell = 0.7;
extern double DeMarker_OpenLevel_Buy = 0.7;
 bool   DeMarker_Buy_signal=false, DeMarker_Sell_signal=false,
       MA_Buy_signal=false, MA_Sell_signal=false;



extern int t_trend_period =6; // для оптимизации по всем периодам от 0 до 7 шаг 1
                              // на каком ТФ работаем: 1-М1, 2-М5, 3-М15, 4-М30, 5-Н1, 6 - Н4, 7-день
 

//--------------------------------------------------------------- 3 --
int Criterion()                        // Пользовательская функция
  {
  //--------------------------------------------------------------- 4 --
 int trend_period=GetPeriod(t_trend_period); // для выбора оптимального значения рабочего ТФ

   // Параметры технич. индикат:
                 
double Taichi_1 = iCustom (Symbol(), trend_period, "Cronex Taichi",Tenkan, Kijun, Senkou, FlatSE, 0, 1);
double TaichiFor_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 3, 1);
double Signal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 1, 1);
double SSignal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 2, 1);

double FlatBuffer1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 4, 1);
double FlatBuffer2 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 5, 1);

double DeMarker_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 1);
double DeMarker_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 2);

double FastMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 1);
double FastMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 2);

double SlowMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 1);
double SlowMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 2);

//--------------------------------------------------------------- 5 --
   // Вычисление торговых критериев
   
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (DeMarker_Buy_signal == true && DeMarker_Sell_signal==false)) &&  // когда DeMarker пересекает медленую (выше уровня бай (0.7)) для лонг
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (MA_Buy_signal==true && MA_Sell_signal==false)) && // пересечение МА DeMarkers
   
   
      (iClose(Symbol(), trend_period,1) > Taichi_1 && Taichi_1 > TaichiFor_1 && Signal_1 > SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
     
         {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(10);                      // Открытие Buy    
         }
        
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (DeMarker_Buy_signal==false && DeMarker_Sell_signal==true)) &&  // когда DeMarker пересекает медленую (ниже уровня селл) для шорт
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (MA_Buy_signal==false && MA_Sell_signal==true)) && // пересечение МА DeMarkers
        
      (iClose(Symbol(), trend_period,1) < Taichi_1 && Taichi_1 < TaichiFor_1 && Signal_1 < SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
        {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(20);  
        }                       // Открытие Sell 
  
//--------------------------------------------------------------- 6 --
   return(0);                          // Выход из пользов. функции
  }
//--------------------------------------------------------------- 7 --

//для оптимизации по всем ТФ
int GetPeriod(int period)
{int periodres;
 switch(period)
  {
   case 1: periodres=1;break;
   case 2: periodres=5;break;
   case 3: periodres=15;break;
   case 4: periodres=30;break;
   case 5: periodres=60;break;
   case 6: periodres=240;break;
   case 7: periodres=1440;break;
   case 8: periodres=10080;break;
   default: periodres=1;break;
  }
return(periodres);
} 


int type_op_DeMarker(double D1, double D2, double F1, double F2, double S1,double S2)// Функция - условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               
{
      
     if (D2-S2 < 0 && D1-S1 > 0 && D1 > F1  && D1 < DeMarker_OpenLevel_Buy)
          {
             DeMarker_Buy_signal=true;
             DeMarker_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (D2-S2 > 0 && D1-S1 < 0 && D1 < F1 && D1 > DeMarker_OpenLevel_Sell)                                                                                   
          {
             DeMarker_Buy_signal=false;
             DeMarker_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);
     
}

int type_op_MA(double d1, double d2, double f1, double f2, double s1,double s2) // условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               

  {
          
     if (f2 - s2 < 0 && f1 - s1 > 0)
          {
             MA_Buy_signal=true;
             MA_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (f2-s2 > 0 && f1-s1 < 0)                                                                                                               
          {
             MA_Buy_signal=false;
             MA_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);

  }

Salverete inoltre l'ora attuale quando il criterio principale viene attivato usando TimeCurrent, cioè specificherete un'espressione di tipo x = TimeCurrent prima direturn(OP_BUY); oreturn(OP_SELL); dove x è una variabile globale di tipo datetime per analogia nella prima funzioneint_op_DeMarker. Poi fate lo stesso con la seconda funzioneint type_op_MA... - lì si memorizza la variabile y = TimeCurrent;

Poi si confronta il valore di queste due variabili con il segno più nel blocco di calcolo dei criteri di trading (si scopre che non è necessario l'analogo di lavorare con i valori UTC - invece si prende un confronto del tempo di ricezione dei vostri due segnali commerciali):

 // Вычисление торговых критериев
   
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (DeMarker_Buy_signal == true && DeMarker_Sell_signal==false)) &&  // когда DeMarker пересекает медленую (выше уровня бай (0.7)) для лонг
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (MA_Buy_signal==true && MA_Sell_signal==false)) && // пересечение МА DeMarkers
   
   
      ((x+43200) < y )) //43200 - это количество секунд в 12-ти часах
     
         {
           Print ("Время сработки первого условия х(в секундах) = ", х, " Время сработки второго условия y (в секундах) = ", y);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(10);                      // Открытие Buy    
         }

P.S. In più vi invio una funzione per la possibilità di ottimizzare il valore del TF di lavoro.

P.P.S. Ecco come questa struttura di codice è organizzata nel mio codice. Non escludo che ci siano varianti di codice molto migliori per soddisfare tali condizioni dell'EA. :-)))

 

Come faccio a calcolare un profitto su una coppia di valute nel mio EA?

Per esempio, ho sette ordini di acquisto aperti su euro a prezzi diversi. Come posso calcolare un profitto su euro senza influenzare altri ordini su altre coppie? ????

 

utilizzare SelectOrder per analizzare tutti gli ordini aperti

controlla la coppia richiesta (OrderSymbol)

poi aggiungere il profitto a qualsiasi variabile se è l'OrderProfit richiesto

Ecco un link con funzioni utili https://docs.mql4.com/ru/trading/OrderSelect

sulla sinistra c'è un menu con le operazioni, tutte sono descritte lì