Questions des débutants MQL4 MT4 MetaTrader 4 - page 214

 
Aleksandr Martynov:

UPS, je pense que je l'ai trouvé :

Selon la documentation :

Si un indicateur personnalisé est appelé à l'aide de la fonctioniCustom(), cet indicateur s'exécute dans le thread du programme appelant. Les fonctions de la bibliothèque (importées) fonctionnent également dans le fil du programme appelant.

De manière générale, pour MQL4 , l'endroit où vous placez les calculs n'a pas d'importance, car les ressources seront allouées pour le seul thread du programme et les indicateurs utilisés par celui-ci.

Dans ce cas, il est conseillé, si possible, de transférer le code de l'indicateur à l'Expert Advisor et d'optimiser le nombre de valeurs calculées par la profondeur du tableau et le nombre de "tampons", bien que cela ne concerne pas les algorithmes récursifs - il est toujours plus facile de les lire dans l'indicateur, car le programme a automatiquement indexé les tampons pour les données de prix seulement ...

Le problème réside dans la commodité de la lecture et de l'édition du code, et donc mt4 est monofilaire dans une seule fenêtre. Il est plus facile pour moi de reprendre la partie calcul d'un indicateur dans un conseiller expert. Mais ce n'est pas toujours bon. Le code s'avère long, alors qu'inludes ou iQuest c'est pareil. Si vous voulez accélérer, alors mt5. mt4 n'est pas assez rapide, à en juger par les participants au forum.

 
Valeriy Yastremskiy:

La question est de savoir s'il est facile de lire et d'éditer le code, et en l'état actuel des choses, mt4 est monofilaire dans une seule fenêtre. Je trouve qu'il est plus facile d'intégrer la partie calcul d'un indicateur dans un EA. Mais ce n'est pas toujours bon. Le code s'avère long, alors qu'inludes ou iQuest c'est pareil. Si vous voulez accélérer, passez à mt5. mt4 est plus lent, à en juger par les commentaires du forum.

Si vous voulez accélérer, alors c'est mt5, mais mt4 est perdant, à en juger par les commentaires du forum. Donc des formules simples comme la moyenne, le zigzag, et pas n'importe quel type. 5 est certainement une bonne chose, mais tout le monde ne le fournit pas encore et vous devez l'apprendre.

 
Aleksandr Martynov:

la gestion des tampons de calcul dans l'EA sera plus coûteuse que l'indicateur... Donc des formules simples comme le calcul de la moyenne, le zigzag et pas toutes. 5 est une bonne chose, bien sûr, mais tout le monde n'y a pas accès.

Mais pour ce faire, il faut supprimer le code de la logique des indicateurs, ce qui n'est pas toujours facile.

 
Est-il sûr de donner l'EA et les logs du terminal à un développeur à sa demande ? Peut-il faire quelque chose à mon compte ou à mon ordinateur ?

 
Alexander Kovalev:
Est-il sûr de donner l'EA et les logs du terminal au développeur à sa demande ? Peut-il faire quelque chose à mon compte ou à mon ordinateur ?

Oui, et aussi prendre tous les bijoux en or de la maison dans le cercueil.

 

Mes amis, s'il vous plaît, conseillez-moi où je me trompe (s'il vous plaît, ne me tuez pas, je travaille dans MQL4 depuis 3 jours).


J'essaie d'ouvrir un ordre de VENTE sur le marché à un prix en retrait de Delta points (60) par rapport à la valeur précédemment placée (que je prends lors de l'ouverture d'un ordre précédent).

Cependant, le script ouvre un nouvel ordre en même temps que l'ordre précédent, au prix actuel, sans attendre la condition appropriée (une baisse du prix de 60 points). Je sais que je suis arrivé quelque part, mais je ne comprends toujours pas où c'est.

Je vous en serais très reconnaissant !


Une étrange découverte

 

Aidez-moi ! !!

Je n'arrive pas à trouver où est mon problème. L'EA nécessite des volumes EMA. J'ai utilisé iMAonArray.

Mais le calcul n'est pas similaire à la réalité.

Voici le code :

***

Dossiers :
 
Aleksandr Martynov:
Bonne question, j'ai une voiture et quelque chose cliquette dedans, quel boulon serrer ? Avez-vous une idée de tous les conseils possibles et finalement ils sont tous inutiles parce que vous devez serrer l'écrou...
Il y a seulement un code dans le studio et pas d'autre moyen.

Regardez la raison pour laquelle il ne s'ouvre pas pour l'or ?

***

Документация по MQL5: Дата и время / TimeCurrent
Документация по MQL5: Дата и время / TimeCurrent
  • www.mql5.com
Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это –...
 
Наджибулло Хабибов:

Regardez la raison pour laquelle il ne s'ouvre pas sur l'or ?

***

Insérez le codecorrectement : utilisez le bouton Code ou alternativement : joignez le fichier en utilisant le bouton Joindre le fichier
MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • www.mql5.com
Теперь вы можете не только читать статьи и скачивать программы на языке MQL5, но и участвовать в обсуждении интересующих вас тем на Форуме, оставлять комментарии к статьям и опубликованным кодам. Кроме того, вы можете не только выкладывать собственные разработки в Code Base, но и публиковать Статьи, за которые мы предлагаем вознаграждение...
 
Наджибулло Хабибов:

Regardez la raison pour laquelle il ne s'ouvre pas sur l'or ?

***

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 1;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern double Profit     = 0;        // Профит в валюте
extern int StopLoss      = 0;        // Стоп Лось
extern int TakeProfit    = 0;        // ТейкПрофит
extern int BULevel       = 0;        // уровень БУ
extern int BUPoint       = 30;       // пункты БУ
extern int TrailingStop  = 0;        // трал
extern int StartHour     = 0;        // час начала торговли
extern int StartMin      = 30;       // минута начала торговли
extern int EndHour       = 23;       // час окончания торговли
extern int EndMin        = 30;       // минута окончания торговли
extern int Reverse       = 0;        // 1-реверс
extern int CloseSig      = 0;        // 1-закрытие по сигналу
extern int Slip          = 30;       // реквот
extern int Shift         = 1;        // на каком баре сигнал индикатора
extern int Magic         = 123;      // магик

extern string IndName    = "Aroow";
extern int SignalPeriod  = 9;

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool TimeSession(int aStartHour,int aStartMinute,int aStopHour,int aStopMinute,datetime aTimeCur)
  {
//--- время начала сессии
   int StartTime=3600*aStartHour+60*aStartMinute;
//--- время окончания сессии
   int StopTime=3600*aStopHour+60*aStopMinute;
//--- текущее время в секундах от начала дня
   aTimeCur=aTimeCur%86400;
   if(StopTime<StartTime)
     {
      //--- переход через полночь
      if(aTimeCur>=StartTime || aTimeCur<StopTime)
        {
         return(true);
        }
     }
   else
     {
      //--- внутри одного дня
      if(aTimeCur>=StartTime && aTimeCur<StopTime)
        {
         return(true);
        }
     }
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   
   if(CountTrades()>0)
     {
      lot=NormalizeDouble(lot*MathPow(KLot,CountTrades()),2);
     }
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*_Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*_Point)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*_Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if((OrderOpenPrice()-Ask)>TrailingStop*_Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*_Point)) || (OrderStopLoss()==0))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*_Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BU()
  {
   bool m;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderOpenPrice()<=(Bid-(BULevel+BUPoint)*_Point) && OrderOpenPrice()>OrderStopLoss())
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BUPoint*_Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()>=(Ask+(BULevel+BUPoint)*_Point) && (OrderOpenPrice()<OrderStopLoss() || OrderStopLoss()==0))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BUPoint*_Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double blu = iCustom(NULL,0,IndName,SignalPeriod,4,Shift);
   double red = iCustom(NULL,0,IndName,SignalPeriod,5,Shift);
   double blu2 = iCustom(NULL,0,IndName,SignalPeriod,4,Shift+1);
   double red2 = iCustom(NULL,0,IndName,SignalPeriod,5,Shift+1);

   bool buy = blu<1000 && red2<1000;
   bool sell = red<1000 && blu2<1000;

   if(Reverse>0)
     {
      buy = red<1000 && blu2<1000;
      sell = blu<1000 && red2<1000;
     }

   if(BULevel>0)
      BU();
   if(TrailingStop>0)
      Trailing();
   if(AllProfit()>Profit && Profit>0)
      CloseAll();

   if(TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()) && t!=Time[0])
     {
      if(buy)
        {
         PutOrder(0,Ask);
        }
      if(sell)
        {
         PutOrder(1,Bid);
        }
      t=Time[0];
     }

   if(CountTrades()>0 && CloseSig>0)
     {
      if(sell)
        {
         CloseAll(0);
        }
      if(buy)
        {
         CloseAll(1);
        }
     }

   Comment("\n blu: ",blu,
           "\n red: ",red,
           "\n All Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+
Raison: