Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1800

 

Quel est le DecreaseFactor du conseiller MT standard sur mashcats?

lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
 
Nerd Trader #:

C'est étrange, les boutons sont là maintenant. Et l'encombrement du code, parce que c'est un projet. Quoi qu'il en soit, j'ai déjà fait une version qui fonctionne, la dernière chose qu'il reste à faire est de supprimer les boutons, là encore cette merde a commencé : la fonction de suppression ne trouve aucun des 4 objets.

En cliquant sur le bouton, on crée toutes les lignes :

Si le bouton est appuyé - supprimer :

Quelle connerie est écrite, je suis désolé.

 
Artyom Trishkin #:

Et vous n'avez pas besoin de regarder les événements. Ils ne fonctionnent pas du tout dans le testeur. Vous devez surveiller le statut.

UPD. Pas modeste bien sûr, mais si vous aviez écouté mes conseils pour une fois, vous auriez tout fait depuis longtemps. De manière appropriée et sans les béquilles d'un immeuble à étages.

Mais chacun choisit l'abîme dans lequel il veut plonger.

Mihail Matkovskij #:

Pour utiliser le débogage dans le testeur, apprenez à écrire en MQL5. Tout y fonctionne.

Il n'y a pas de renommage d'objet. Imaginez que vous remplacez un objet existant par un nouvel objet.

C'est impossible. Votre code ressemble à un fouillis de choses. C'est probablement la raison pour laquelle vous rencontrez des décalages avec les boutons. Comme je vous l'ai déjà dit, commencez par quelque chose de simple. Ne compliquez pas trop les choses. Et compliquez-le progressivement lorsque le simple commence à fonctionner et que vous avez confiance en lui.

Et comment puis-je voir les états s'ils sont déclenchés par un événement (par un clic) ? Oui, mais j'écris en mql4, c'est la même chose que de dire "apprenez à écrire en c# où le débogage fonctionne".

"Correct et sans béquilles à plusieurs étages. "Donc cacher des objets n'est qu'une béquille.

Tout ce que j'ai fait, tout fonctionne https://gist.github.com/satorkain/0cf7a8df8ec1f4b3191defd04c94a418
En cliquant sur le bouton, toutes les lignes sont créées en même temps, puis elles sont cachées et il n'en reste qu'une seule selon l'emplacement du panneau du bouton. D'autres lignes sont cachées/affichées en fonction de l'emplacement du curseur par rapport au prix.

P.S.

Si ce n'était pas pour mql4 tordu, je n'aurais pas eu à inventer cette absurdité de cacher des objets, tout aurait dû fonctionner du premier coup avec la suppression/le renommage des objets.

stop order button (public).mq4
stop order button (public).mq4
  • gist.github.com
GitHub Gist: instantly share code, notes, and snippets.
 
Nerd Trader #:

Et comment puis-je voir les états s'ils sont déclenchés par un événement (par un clic) ? Oui, mais j'écris en mql4, c'est la même chose que de dire "apprenez à écrire en c# où le débogage fonctionne".

"Correct et sans béquilles à plusieurs étages. " - donc cacher les objets n'est qu'une béquille.

Tout ce que j'ai fait, tout fonctionne https://gist.github.com/satorkain/0cf7a8df8ec1f4b3191defd04c94a418
En cliquant sur le bouton, toutes les lignes sont créées en même temps, puis elles sont cachées et il n'en reste qu'une seule selon l'emplacement du panneau du bouton. D'autres lignes sont cachées/affichées en fonction de l'emplacement du curseur par rapport au prix.

P.S.

Si le mql4 n'était pas tordu, je n'aurais pas eu à inventer cette absurdité pour cacher les objets, tout aurait dû fonctionner du premier coup avec la suppression/le renommage des objets également.

Cacher un objet est juste la méthode recommandée par le développeur. Et il existe une propriété spéciale pour cela. Pour voir l'état, vous devez regarder la propriété "State" du bouton.

Ce qui esttordu ici, c'est votre logique et la substitution des notions - vous prenez les moyens recommandés par le développeur comme une béquille, et vous prenez la création/suppression constante et vorace d'objets comme du code pur, mais c'est exactement ce qui est une béquille, en contournant la méthode rapide recommandée.

À propos, pour qu'un objet se retrouve rapidement au-dessus de tous les autres, vous devez le rendre invisible, puis immédiatement visible - cela redéfinira sa position dans la liste des objets, et il se retrouvera en haut.

ZS. Et même là, sur le git, tu as publié le code avec un C-moins. Totalement sujet aux erreurs. Il suffit qu'une ligne ne soit pas créée pour que tout s'effondre. Cela s'est tout de suite vu. Vous créez des lignes dans le gestionnaire d'événement - pour quoi faire ? Pourquoi avez-vous besoin de OnInit() ? Vous l'avez créé, vérifié son succès, mis un drapeau et caché. Dans OnDeinit(), vous avez supprimé les objets créés par votre programme. Vous avez également besoin du préfixe du nom pour cela.

Vous ne faites que montrer et cacher dans le gestionnaire d'événements - il ne devrait pas y avoir de construction. Pour votre cas - exactement.

J'aurais honte de publier une telle chose dans le domaine public sur git. Mais c'est pour moi.

Et vous ? Est-il normal que les gens en profitent ?

 
Artyom Trishkin #:

Cacher un objet est exactement la méthode recommandée par le développeur. Et il existe une propriété spéciale pour cela. Pour voir l'état, vous devez regarder la propriété "State" du bouton.

Ce qui esttordu ici, c'est votre logique et la substitution des notions - vous prenez les moyens recommandés par les développeurs comme une béquille, et vous prenez la création/suppression constante et vorace d'objets comme du code pur, mais c'est exactement ce qui est une béquille pour contourner la méthode rapide recommandée.

À propos, pour qu'un objet se retrouve rapidement au-dessus de tous les autres, vous devez le rendre invisible, puis immédiatement visible - cela redéfinira sa position dans la liste des objets, et il se retrouvera en haut.

ZS. Et même là, sur le git, tu as publié le code avec un C-moins. Totalement sujet aux erreurs. Dès qu'une ligne n'est pas créée, tout s'écroule. Cela s'est tout de suite vu. Vous créez des lignes dans le gestionnaire d'événement - pour quoi faire ? Pourquoi avez-vous besoin de OnInit() ? Vous le créez, vérifiez son succès, mettez un drapeau et le cachez. Dans OnDeinit(), vous avez supprimé les objets créés par votre programme. Vous avez également besoin du préfixe du nom pour cela.

Vous ne faites que montrer et cacher dans le gestionnaire d'événements - il ne devrait pas y avoir de construction. Pour votre cas - exactement.

J'aurais honte de publier une telle chose dans le domaine public sur git. Mais c'est pour moi.

Et vous ? Est-il normal que les gens en profitent ?

Vorace pour créer 1 ligne de 4 selon les besoins ? :) Et s'il y a 200 lignes ? Sera-t-il économique de les créer tous en même temps selon votre logique ? Et la façon dont elle a été conçue par les développeurs n'est connue que d'eux, et conçue d'une manière très peu intuitive. Comme si rien d'incroyable ou d'illogique n'était requis. Comment aurais-je pu savoir que je devais travailler avec des objets uniquement de cette manière et pas d'une autre ? Peut-être d'un manuel sur le mql4 ? Je doute que ce point y soit expliqué.

Au moins, cela fonctionne comme prévu :) C'est entre parenthèses dans le titre (public), donc ce n'est pas encore complet, mais oui, il n'y a pas de vérification pour créer des objets, corrigeons cela. Et je l'ai posté sur git uniquement parce que je ne me souvenais pas de paste bin. Honteux ? Le Git a été créé pour que les gens apprennent, échangent leurs expériences, partagent du code, qu'il fonctionne ou non, cela ne fait aucune différence, tout le monde peut créer un fork et apporter des modifications s'il n'est pas satisfait de quelque chose.

Voilà, 250 objets ont été créés et stockés en mémoire pour la durée de l'Expert Advisor. Très bien, merci, je saurai. C'est ce que j'entends par "logique non-intuitive". Par exemple, dans le tutoriel sur OnInit(), vous pouvez lire seulement que la fonction est traitée pendant l'initialisation du conseiller expert/indicateur.

 
Nerd Trader #:


Laissez-moi vous dire un secret. Vous pouvez créer jusqu'à 1 000 objets ou plus, tant que vous n'avez pas de "calculatrice". Mais il peut aussi le faire. Une calculatrice est un ordinateur doté de 4 Go de RAM. Tout ce qui est en dessous est "la calculatrice de grand-mère"... :) Vous pouvez donc créer des objets en une fois ou un par un. Cela ne fait aucune différence. Mais sans fanatisme.

Ainsi, tout fonctionne pour tout le monde si vous le faites à bon escient ....

 
Nerd Trader #:

Voracité pour créer 1 ligne de 4 selon les besoins ? :) Et s'il y a 200 lignes ? Serait-il économique de les créer tous en même temps selon votre logique ? Et la façon dont elle a été conçue par les développeurs n'est connue que d'eux, et conçue d'une manière très peu intuitive. Comme si rien d'incroyable ou d'illogique n'était requis. Comment aurais-je pu savoir que je devais travailler avec des objets uniquement de cette manière et pas d'une autre ? Peut-être d'un manuel sur le mql4 ? Je doute que ce point y soit expliqué.

Au moins, cela fonctionne comme prévu :) C'est entre parenthèses dans le titre (public), donc ce n'est pas encore complet, mais oui, il n'y a pas de vérification pour créer des objets, corrigeons cela. Et je l'ai posté sur git uniquement parce que je ne me souvenais plus de paste bin. Honteux ? Le Git a été créé pour que les gens apprennent, échangent leurs expériences, partagent du code, qu'il fonctionne ou non, cela ne fait aucune différence, tout le monde peut créer un fork et apporter des modifications s'il n'est pas satisfait de quelque chose.

Voilà, 250 objets ont été créés et stockés en mémoire pour la durée de l'Expert Advisor. Très bien, merci, je saurai. C'est ce que j'entends par "logique non-intuitive". Vous pouvez lire dans le tutoriel, par exemple, à propos de OnInit(), que la fonction est traitée pendant l'initialisation d'un EA/indicateur.

Vous pouvez créer autant d'objets que vous le souhaitez en même temps. À l'époque, MT n'était pas très développé en termes de dessin de tampons d'indicateurs, nous devions dessiner 400 chandeliers visibles avec des lignes de tendance, pour un chandelier nous avons besoin de 5 lignes, 400*5=2000, plus un objet pour chacun et ainsi de suite. Au total, nous avons obtenu environ 2500 objets. Il a fonctionné sans aucune fadeur.

Vous ne comprenez pas tout à fait la logique du travail avec les objets, mais vous savez comment argumenter. Il est préférable de faire le contraire.

 
Nerd Trader #:

Voracité pour créer 1 ligne de 4 selon les besoins ? :) Et s'il y a 200 lignes ? Serait-il économique de les créer tous en même temps selon votre logique ? Et la façon dont elle a été conçue par les développeurs n'est connue que d'eux, et conçue d'une manière très peu intuitive. Comme si rien d'incroyable ou d'illogique n'était requis. Comment aurais-je pu savoir que je devais travailler avec des objets uniquement de cette manière et pas d'une autre ? Peut-être d'un manuel sur le mql4 ? Je doute que ce point y soit expliqué.

Au moins, cela fonctionne comme prévu :) C'est entre parenthèses dans le titre (public), donc ce n'est pas encore complet, mais oui, il n'y a pas de vérification pour créer des objets, corrigeons cela. Et je l'ai posté sur git uniquement parce que je ne me souvenais pas de paste bin. Honteux ? Le Git a été créé pour que les gens apprennent, échangent leurs expériences, partagent du code, qu'il fonctionne ou non, cela ne fait aucune différence, tout le monde peut créer un fork et apporter des modifications s'il n'est pas satisfait de quelque chose.

Voilà, 250 objets ont été créés et stockés en mémoire pour la durée de l'Expert Advisor. Eh bien, merci, je le saurai. C'est ce que j'entends par "logique non-intuitive". La seule chose que vous pouvez lire dans le tutoriel, par exemple, à propos de OnInit(), est que la fonction est traitée pendant l'initialisation du conseiller expert/indicateur.

Bienvenue. Je vais essayer de l'expliquer en russe simple.

Vous allez faire une partie de pêche.

  1. À la maison, vous ouvrez le garde-manger, vous vous grattez la tête et vous le refermez.
  2. Vous allez à la pêche et vous avez besoin d'une canne à pêche.
  3. Vous allez à la réserve pour acheter une canne à pêche.
  4. Vous êtes allé pêcher, vous avez lancé votre ligne et attrapé un poisson, et vous avez besoin d'un filet.
  5. Je suis allé à la réserve pour le filet.
  6. Vous êtes allé pêcher, vous avez ramassé le poisson que vous aviez attrapé et qui flottait sur l'hameçon avec le filet, et vous aviez besoin d'un récipient pour conserver le poisson que vous aviez attrapé
  7. Rentrez chez vous pour ..... Dois-je continuer ?

Ou bien vous pouvez prendre directement tout ce dont vous avez besoin dans le garde-manger (OnInit), pêcher sans courir partout et, en rentrant chez vous, tout ranger dans le garde-manger et le réfrigérateur (OnDeinit).

Vous en avez peut-être entendu parler ici sur le forum. Il faut juste écouter et entendre ce qu'on vous dit parfois.

Sinon, on vous pose une question, on vous répond, on vous dit "conneries" et on fait ce qu'on pense.

Vous devez d'abord réfléchir à la question, poser des questions, puis commencer à rédiger.

Savez-vous que la chose la plus simple en programmation est l'impression du code ? Et la part du lion du développement consiste à penser à la logique.

 

Je suis désolé de remettre ça sur le tapis une deuxième fois.

Mais il y a un problème que je ne peux pas encore résoudre, à savoir

l'ouverture d'une série d'ordres (l'un après l'autre) sur le même chandelier.

Je dois empêcher l'EA d'ouvrir un nouvel ordre sur le même chandelier.

J'ai pensé à le résoudre en utilisant Sleep(), mais Makar a dit qu'il serait mieux de ne pas arrêter le processus.

problème.

Le code ressemble maintenant à ceci :

// Параметры советника
input string  sParametersEA = "";     // Параметры советника
input double  Lot           = 0.01;   // Количество лотов
input int     StopLoss      = 30;     // Уровень убытка
input int     TakeProfit    = 30;     // Уровень прибыли
input int     Slippage      = 3;      // Проскальзование (в пунктах)
input int     Magic         = 1;      // Индентификатор советника
input double  K_Martin1     = 2.0;    // Множитель мартин 1
input double  K_Martin2     = 2.0;    // Множитель мартин 2
input double  K_Martin3     = 2.0;    // Множитель мартин 3
input int     OrdersClose   = 5;      // Ограничение лотности мартин1
input int     OrdersClose2  = 5;      // Ограничение лотности мартин2
input int     DigitsLot     = 2;      // Точность лотности
// Параметры индикатора
input string  sParametersMA = "";     // Параметры индикатора
input int     PeriodMA      = 14;     // Период мувинга
input int     MovingShift   = 1;      // Сдвиг мувинга
// Глобальные переменные
string AC;
datetime Start;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
//+-----------------------------------------------------------------------------------------------+
int OnInit()
  {
Start          = TimeCurrent();
MaxMartinLot   = Lot*MathPow(1.4,OrdersClose);
MaxMartinLot2  = Lot*MathPow(K_Martin2,OrdersClose2);
AC             = StringConcatenate(" ", AccountCurrency());
return(INIT_SUCCEEDED);
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return(cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if(dMA > Open[1] && dMA < Close[1])  //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if(dMA < Open[1] && dMA > Close[1])
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Тикет ордера
   int iOTi = 0;   

   iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
// Тикет ордера  
   int iOTi = 0;   
//Print(bCheckOrders());
   iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);

// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify(int iOTi)
  {
   int    iOTy = -1;    // Тип ордера
   double dOOP = 0;     // Цена открытия ордера
   double dOSL = 0;     // Стоп Лосс
   int    iMag = 0;     // Идентификатор советника
   double dSL  = 0;     // Уровень убытка
   double dTP  = 0;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
     {
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
      if(dOSL == 0)
        {
         if(iOTy == OP_BUY)
           {
            dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }

         if(iOTy == OP_SELL)
           {
            dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }
        }
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                      Функция обработки ошибок |
//+-----------------------------------------------------------------------------------------------+
void vError(int iErr)
  {
   switch(iErr)
     {
      case 129:   // Неправильная цена
      case 135:   // Цена изменилась
      case 136:   // Нет цен
      case 138:   // Новые цены
         Sleep(1000);
         RefreshRates();
         break;

      case 137:   // Брокер занят
      case 146:   // Подсистема торговли занята
         Sleep(3000);
         RefreshRates();
         break;
     }
  }
//+-----------------------------------------------------------------------------------------------+
double LOT()
{
   int n=0;
   int m=0;
   int v=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderProfit()>0) 
            {

               if (n==0) OL=NormalizeDouble(OrderLots()+K_Martin1,DigitsLot);
               n++;
               
               if ((OL>=MaxMartinLot)&& (m==0)) OL=NormalizeDouble(OrderLots()*K_Martin2,DigitsLot);
               m++;
               
               if ((OL>=MaxMartinLot2) && (v==0)) OL=NormalizeDouble(OrderLots()*K_Martin3,DigitsLot);
               v++;
            }
            else
            {
               if (n==0) {return(Lot);}
               else {return(OL);}
            }
         }
      }
   }
   
   return(OL);
}
 
законопослушный гражданин #:

J'ai besoin que l'EA ne puisse pas ouvrir un nouvel ordre sur la même bougie.

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  if (time != cTime)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
Raison: