Menos código, mais ação... escrever um EA - página 4

 
Maxim Kuznetsov:
Por que você retirou o cargo sobre o próximo passo?

Por favor, coloque sua arrogância à prova. E leia as regras do recurso.

Todos vocês podem escrever nos posts do fórum e na descrição no KodoBaz.

 
Maxim Kuznetsov:
Por que você retirou o cargo sobre o próximo passo?

Vi o correio, não vi nada de criminoso. Acho que eu não estava procurando o suficiente.

 
Maxim Kuznetsov:

Claro que o equilíbrio está diminuindo. O que você espera de "duas passagens de MA"?


Você pode tomar uma base diferente para a EA - os MAs estão longe de ser a melhor opção.

 
aleger:

Você pode tomar uma base diferente para a EA - mashki está longe de ser a melhor opção.

Se você olhar um pouco mais cuidadosamente, você notará que já pode implementar algumas coisas :-)

Assim, acontece o seguinte:

* programador de aplicação (usuário da biblioteca) declarou que possui microexcel com várias colunas (em caso de uso estas são FAST_MA,SLOW_MA,SIGNAL_BUY,SIGNAL_SELLL)

* e esboçou uma função como ele sabe como calcular células individuais. No exemplo, ele se referiu ao iMA.

* ao mesmo tempo ele pode acessar livremente outras células desta tabela (DataFrame quebrará se possível as seqüências)

* e separadamente o usuário escreveu a função "verificar valores de linha e se é hora de negociar".

Obviamente, isto é suficiente para que a EA comece a negociar. E a estratégia pode ser mudada de forma muito flexível - qualquer coisa que você possa pensar como um cálculo de tabela é possível.
A outra coisa é que este é apenas o primeiro meio passo :-) até agora, o EA está negociando como o mutante macaco, apenas com o lote mínimo, em um símbolo e a partir de um período de tempo.

 

Nas duas primeiras partes, obtivemos um Expert Advisor que pode executar as estratégias mais simples, as quais são descritas como "macacos ou flips by signal" (macacos ou flips por sinal).
Os sinais em si são programados de forma muito simples, quase como no Excel :-)

É hora de ensinar um pouco mais ao Expert Advisor. Ao menos coloque o StopLoss e arraste-o.

Complementar a descrição artística da estratégia com a frase "Stop Loss is placed on the distance STOPLOSS_POINTS and trailing by fractals". Também introduzimos mudanças no caso de uso descrito acima:

  • nova entrada de parâmetro EA em STOPLOSS_POINTS=100;
  • adicionar dois campos calculados UPPER_FRACTAL,LOWER_FRACTAL em ENUM_SERIES
  • e na função GetData adicionar dois "case:" para calculá-los

e fornecer ao usuário uma função (método da classe EA), para configurar a EA. A entrada mais simples pode ser vista como

SetStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL);

diz: "estabelece o Stop Loss a uma distância especificada, e as redes de arrasto compram por coluna LOWER_FRACTAL,vendem por UPPER_FRACTAL"; acho que o método tem um nome óbvio e sua sintaxe é mais ou menos clara.

O usuário hipotético fez muitos gestos (entrada declarada, acrescentou duas colunas e chamou configurações de funções), vamos desenvolver a biblioteca para que suas ações conduzam ao resultado esperado. Também teremos que desenvolver cálculos tabulares e lançar as bases para o mecanismo de mensagem/evento.

No copy-paste, todos os comentários desnecessários e o código MQL5 foram removidos para a compacidade

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:

Já é difícil olhar para um código como este. Escrever externamente de forma simples é uma tarefa difícil. A concisão é importante, mas mesmo com ela, a simplicidade pode facilmente escapar.

Sua opinião sobre seu código, assim como a minha, é muito subjetiva. Os observadores de fora podem dizer muito mais objetivamente se é complicado ou simples.

Como um observador de seu código - complicado.

 
fxsaber:

Já é difícil olhar para um código como este. Escrever externamente de forma simples é uma tarefa difícil. A concisão é importante, mas mesmo com ela, a simplicidade pode facilmente escapar.

Sua opinião sobre seu código, assim como a minha, é muito subjetiva. Os observadores de fora podem dizer muito mais objetivamente se é complicado ou simples.

Como um observador de seu código - complicado.

Sugerir uma entrada mais clara e concisa apenas para o caso de uso. Ou edições para a atual.

Este é o ponto mais difícil - e é o que é mais oferecido para discussão.




 
Maxim Kuznetsov:

Eles sugeriram uma notação mais lúcida e concisa apenas para o caso de uso. Ou edições para a atual.

Este é o ponto mais difícil - e apenas o mais proposto para discussão.

Eu não vou sugerir isso, pois não sei e nem entendo por que é necessário. A MQL4 dificilmente será mais simples do que a MQL4 para um observador externo. Os desenvolvedores da MQL4 atingiram de forma brilhante uma arquitetura simples.

 

O que você quer ganhar com isso? Para ser honesto, eu não entendo. No início eu pensava que se pretendia uma estrutura à la, mas não, nenhuma classe de invólucros para indicadores, ordens, algoritmos padrão de tomada de decisão, nada. Embora muito mais legível é esta construção: fast.Get(2)>=slow.Get(1); (é apenas para dar o exemplo), mas a declaração:

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

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

Isso é algo que podemos discutir, enquanto você, IMHO, está pisando na hora.

 
fxsaber:

Como um observador de seu código - difícil.

Concordo, é muito difícil ler seu código, mesmo que você conheça o idioma.

Razão: