Moins de code, plus d'action... l'écriture d'un EA - page 4

 
Maxim Kuznetsov:
Pourquoi avez-vous retiré le post sur la prochaine étape ?

Veuillez mettre votre arrogance à l'épreuve. Et lisez les règles de la ressource.

Vous pouvez tous écrire dans les messages du forum et dans la description dans KodoBaz.

 
Maxim Kuznetsov:
Pourquoi avez-vous retiré le post sur la prochaine étape ?

J'ai vu le message, je n'ai rien vu de criminel. Je suppose que je ne cherchais pas assez.

 
Maxim Kuznetsov:

Bien sûr que le solde est en baisse. Qu'attendez-vous de "deux MA qui se croisent" ?


Vous pouvez prendre une base différente pour l'EA - les MAs sont loin d'être la meilleure option.

 
aleger:

Vous pouvez prendre une base différente pour l'EA - le mashki est loin d'être la meilleure option.

Si vous regardez un peu plus attentivement, vous remarquerez que vous pouvez déjà mettre en œuvre un certain nombre de choses :-)

Il en résulte ce qui suit :

* Le programmeur de l'application (utilisateur de la bibliothèque) a déclaré avoir un micro-excel avec plusieurs colonnes (dans le cas d'utilisation, ce sont FAST_MA, SLOW_MA, SIGNAL_BUY, SIGNAL_SELL).

* et a esquissé une fonction comment il sait calculer les cellules individuelles. Dans l'exemple, il fait référence à iMA.

* En même temps, il peut accéder librement à d'autres cellules de ce tableau (DataFrame brisera les séquences si possible).

* et séparément, l'utilisateur a écrit la fonction "vérifier les valeurs des lignes et si c'est le moment de faire des échanges".

Évidemment, cela suffit pour que l'EA commence à trader. Et la stratégie peut être modifiée de manière très souple - tout ce que vous pouvez imaginer comme calcul de tableau est possible.
L'autre chose est que ce n'est que la première demi-étape :-) jusqu'à présent, l'EA s'échange comme le monkey-shifter, seulement avec le lot minimum, sur un symbole et à partir d'un cadre temporel.

 

Dans les deux premières parties, nous avons obtenu un Expert Advisor qui peut exécuter les stratégies les plus simples, qui sont décrites comme des "singes" ou des "flips par signal".
Les signaux eux-mêmes sont programmés très simplement, presque comme dans Excel :-)

Il est temps d'en apprendre un peu plus sur le conseiller expert. Mettez au moins un StopLoss et parcourez-le.

Complétez la description artistique de la stratégie avec la phrase "Le Stop Loss est placé sur la distance STOPLOSS_POINTS et suivi par des fractales". Nous introduisons également des changements dans le cas d'utilisation décrit ci-dessus :

  • nouveau paramètre d'entrée de l'EA int STOPLOSS_POINTS=100 ;
  • ajouter deux champs calculés UPPER_FRACTAL,LOWER_FRACTAL dans ENUM_SERIES
  • et dans la fonction GetData ajouter deux "case :" pour les calculer

et fournir à l'utilisateur une fonction (méthode de la classe EA), pour configurer l'EA. L'entrée la plus simple peut être vue comme

SetStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL) ;

se lit comme suit : "fixe le Stop Loss à une distance spécifiée, et parcourt les achats par la colonne LOWER_FRACTAL, les ventes par la colonne UPPER_FRACTAL" ; je pense que la méthode a un nom évident et que sa syntaxe est plus ou moins claire.

L'utilisateur hypothétique a fait beaucoup de gestes (il a déclaré l'entrée, ajouté deux colonnes et appelé les paramètres de la fonction), nous développerons la bibliothèque pour que ses actions mènent au résultat attendu. Nous devrons également développer des calculs tabulaires et jeter les bases d'un mécanisme de messages/événements.

Dans le copier-coller, tous les commentaires inutiles et le code MQL5 ont été supprimés pour des raisons de compacité.

input ENUM_APPLIED_PRICE FAST_MA_PRICE=PRICE_CLOSE;
input ENUM_MA_METHOD FAST_MA_METHOD=MODE_EMA;
input int FAST_MA_PERIOD=14;
input int FAST_MA_SHIFT=0;

input ENUM_APPLIED_PRICE SLOW_MA_PRICE=PRICE_CLOSE;
input ENUM_MA_METHOD SLOW_MA_METHOD=MODE_SMA;
input int SLOW_MA_PERIOD=54;
input int SLOW_MA_SHIFT=0;

// начальные значения StopLoss, TakeProfit
input int STOPLOSS_POINTS=100;
input int TAKEPROFIT_POINTS=200;

#include "EA/EA.mqh"

enum ENUM_SERIES {
   FAST_MA,       // id. значений FAST_MA
   SLOW_MA,       // id. значений SLOW_MA 
   SIGNAL_BUY,    // сигнал к покупкам
   SIGNAL_SELL,   // сигнал к продажам
   UPPER_FRACTAL,       // верхний фрактал (для трала стопов ордеров sell)
   LOWER_FRACTAL, // нижний фрактал
   TOTAL_SERIES   // последний элемент перечисления = кол-во элементов
};

double GetData(EA *ea,int id,int shift,DataFrame *table)
{
   switch ((ENUM_SERIES)id) {
      case FAST_MA:
         return table[FAST_MA][shift]=iMA(ea.Symbol,ea.Period,FAST_MA_PERIOD,0,FAST_MA_METHOD,FAST_MA_PRICE,shift);
      case SLOW_MA:
         return table[SLOW_MA][shift]=iMA(ea.Symbol,ea.Period,SLOW_MA_PERIOD,0,SLOW_MA_METHOD,SLOW_MA_PRICE,shift);
      case SIGNAL_BUY:
         return table[SIGNAL_BUY][shift]=table.CrossedUp(FAST_MA,SLOW_MA,shift);
      break;
      case SIGNAL_SELL:
         return table[SIGNAL_SELL][shift]=table.CrossedDn(FAST_MA,SLOW_MA,shift);
      break;
      // Расчёт уровней трала
      case UPPER_FRACTAL:
         // верхний фрактал. уровень по которому тралятся sell
         return table[UPPER_FRACTAL][shift]=iFractal(ea.Symbol,ea.Period,MODE_UPPER,shift+2);
      case LOWER_FRACTAL:
         return table[UPPER_FRACTAL][shift]=iFractal(ea.Symbol,ea.Period,MODE_LOWER,shift+2);
   }
   return EMPTY_VALUE;
}
int SignalOfCross(EA *ea,int shift,DataFrame *data)
{
   if (FAST_MA_PRICE!=PRICE_OPEN || SLOW_MA_PRICE!=PRICE_OPEN) shift++;
   if (data[SIGNAL_BUY][shift]==1.0)  return OP_BUY;
   if (data[SIGNAL_SELL][shift]==1.0) return OP_SELL;
   return -1;
}
EA *ea=NULL;

int OnInit()
{
   ea = new EA();
   ea.SetupTimeframe(_Symbol,_Period,TOTAL_SERIES,30,GetData);
   ea.SetupSignal(SignalOfCross);

        // укажем начальный стоп-лосс ордеров и уровни для тралов 
   ea.SetupStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL);
   // и заодно тейк-профит
   ea.SetupTakeProfit(TAKEPROFIT_POINTS);
   // остальная часть одинакова для всех советников
   //................
}


 
Maxim Kuznetsov:

C'est déjà difficile de regarder un tel code. Écrire en toute simplicité est une tâche difficile. La concision est importante, mais même avec elle, la simplicité peut facilement échapper.

Votre opinion sur votre code, comme mon opinion sur le mien, est très subjective. Les observateurs extérieurs peuvent dire beaucoup plus objectivement si c'est compliqué ou simple.

En tant qu'observateur de votre code - compliqué.

 
fxsaber:

C'est déjà difficile de regarder un tel code. Écrire en toute simplicité est une tâche difficile. La concision est importante, mais même avec elle, la simplicité peut facilement échapper.

Votre opinion sur votre code, comme mon opinion sur le mien, est très subjective. Les observateurs extérieurs peuvent dire beaucoup plus objectivement si c'est compliqué ou simple.

En tant qu'observateur de votre code - compliqué.

Suggérer une entrée plus claire et concise juste pour le cas d'utilisation. Ou des modifications de la version actuelle.

C'est le point le plus difficile - et c'est celui qui est le plus souvent proposé à la discussion.




 
Maxim Kuznetsov:

Ils ont suggéré une notation plus lucide et plus concise juste pour les cas d'utilisation. Ou des modifications de la version actuelle.

C'est le point le plus difficile - et celui qui est le plus souvent proposé à la discussion.

Je ne le suggérerai pas, car je ne sais pas et ne comprends même pas pourquoi c'est nécessaire. Pour un observateur extérieur, MQL4 sera difficilement plus simple que MQL4. Les développeurs de MQL4 ont brillamment mis au point une architecture simple.

 

Que voulez-vous en retirer ? Pour être honnête, je ne comprends pas. J'ai d'abord pensé qu'un cadre de travail était prévu, mais non, pas de classes enveloppantes pour les indicateurs, les ordres, les algorithmes standard de prise de décision, rien. Bien que la construction suivante soit beaucoup plus lisible : fast.Get(2)>=slow.Get(1) ; (c'est juste pour l'exemple), mais la déclaration :

CMA fast=new CMA(NULL,0,12,...) ;

CMA slow=new CMA(NULL,0,100,...) ;

C'est un sujet dont nous pouvons discuter, alors que vous, IMHO, piétinez sur place.

 
fxsaber:

En tant qu'observateur de votre code - difficile.

Je suis d'accord, il est très difficile de lire votre code, même si vous connaissez le langage.