[Archive] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 2. - page 497

 
Veuillez indiquer comment ouvrir un ordre sur une nouvelle barre une seule fois ? ???.
 

code d'intégration dans l'EA, j'avais quelque chose comme ça jusqu'à ce que je l'efface, j'utilisais l'échelle horaire.

orderselect - sélectionne la dernière commande dans l'historique

prendre l'heure de sa fermeture et en sortir l'heure de fermeture

et avant d'ouvrir l'ordre, fixez une condition selon laquelle l'heure actuelle n'est PAS égale à l'heure de clôture de l'ordre dans l'historique.

 

S'il vous plaît aidez-moi avec ce problème, ma variable TP devient zéro après la deuxième mise à jour du prix, c'est-à-dire, le conseiller ouvre un ordre, et TP et Bid ne sont pas tous les deux égaux à zéro, puis le prix est mis à jour à nouveau et TP est zéro, bien que ce n'est pas dans le code, j'ai eu un problème avec tirer SL vers le haut, mais maintenant il s'avère que le problème est dans la définition de 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:

S'il vous plaît, aidez-moi avec ce problème, ma variable TP est remise à zéro après la deuxième mise à jour du prix, c'est-à-dire que l'EA ouvre un ordre et affiche les valeurs de TP et Bid, les deux ne sont pas égales à zéro, puis le prix est mis à jour à nouveau et TP est zéro, bien que dans le code, aucune commande de ce type, j'ai eu un problème avec la remontée de SL, mais maintenant il s'avère que le problème est dans la définition de 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);
}
Essayez comme ça...
 
VOLDEMAR:
Veuillez indiquer comment ouvrir un ordre sur une nouvelle barre une seule fois ? ???.

Lire ici : https://www.mql5.com/ru/forum/134437
 
Cmu4, merci beaucoup, vous m'avez été très utile.
 

Bonjour à tous !

Il y a deux signaux dans la stratégie : un primaire et un secondaire. Une transaction est ouverte lorsque le deuxième signal apparaît au plus tard 12 heures plus tard. Question : Comment puis-je apprendre à mon conseiller expert à ne pas réagir au signal, s'il apparaît après 12 heures ? S'il vous plaît, si vous pouvez donner un exemple concret de code

 
demlin:

Bonjour à tous !

Il y a deux signaux dans la stratégie : un primaire et un secondaire. Une transaction s'ouvre lorsque le deuxième signal apparaît au plus tard 12 heures plus tard. Question : Comment puis-je apprendre à mon conseiller expert à ne pas réagir au signal, s'il apparaît après 12 heures ? S'il vous plaît, si vous pouvez me donner un exemple du code


Salut Dmitry. Pour ma part, je suis prêt à vous proposer l'option suivante. Par analogie, voir le déclenchement des critères de trading de cet article - il y a également deux signaux - à savoir - voir après la deuxième figure "La première chose à attendre sur le graphique DeMarker est lorsque le DeMarker croise la ligne MA rapide et la ligne MA lente autour de 0.7 pour une position courte. C'est le premier signal préliminaire. Ensuite, nous attendons le franchissement des lignes MA elles-mêmes. C'est le signal principal, après lequel les lectures de l'indicateur Taichi peuvent être effectuées. Si les lignes MA ne sont pas croisées, cela est considéré comme un faux signal et le mouvement du prix se poursuivra. Voici comment cela est implémenté dans mon code - dans l'inclusion des hiboux qui sont responsables du déclenchement des critères de trade.

L'astuce principale consiste à travailler à travers les deux en dessous (à la fin) de l'inclusion en mettant en place et en réinitialisant les drapeaux lorsque l'un ou l'autre critère de transaction est déclenché.

//--------------------------------------------------------------------
// 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);

  }

Vous enregistrerez en outre l'heure actuelle lors du déclenchement du critère principal à l'aide de TimeCurrent, c'est-à-dire que vous spécifierez une expression de type x = TimeCurrent avantreturn(OP_BUY) ; oureturn(OP_SELL) ; où x est une variable globale de type datetime par analogie dans la première fonctionint_op_DeMarker. Puis faites de même avec la deuxième fonctionint type_op_MA... - là vous mémorisez la variable y = TimeCurrent ;

Ensuite, dans le bloc de calcul des critères de transaction, vous comparez le signe plus et la valeur de ces deux variables, comme suit (il s'avère que vous n'avez pas besoin de l'analogue du travail avec les valeurs UTC - à la place, vous prenez une comparaison de l'heure de réception de vos deux signaux de transaction) :

 // Вычисление торговых критериев
   
   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. En plus je vous envoie une fonction pour la possibilité d'optimiser la valeur de la TF de travail.

P.P.S. Voici comment cette structure de code est organisée dans mon code. Je n'exclus pas qu'il existe des variantes de code bien meilleures pour remplir de telles conditions de l'EA. :-)))

 

Comment calculer un profit sur une paire de devises dans mon EA ?

Par exemple, j'ai sept ordres d'achat ouverts sur l'euro à des prix différents. Comment puis-je calculer un profit sur l'euro sans affecter les autres ordres sur les autres paires ? ? ???.

 

utiliser SelectOrder pour analyser tous les ordres ouverts

vérifier la paire requise (OrderSymbol)

puis ajoutez le profit à une variable quelconque s'il s'agit du OrderProfit requis.

Voici un lien avec des fonctions utiles https://docs.mql4.com/ru/trading/OrderSelect

sur le côté gauche, il y a un menu avec des opérations, toutes sont décrites ici.