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
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
inputENUM_APPLIED_PRICE FAST_MA_PRICE=PRICE_CLOSE;
inputENUM_MA_METHOD FAST_MA_METHOD=MODE_EMA;
inputint FAST_MA_PERIOD=14;
inputint FAST_MA_SHIFT=0;
inputENUM_APPLIED_PRICE SLOW_MA_PRICE=PRICE_CLOSE;
inputENUM_MA_METHOD SLOW_MA_METHOD=MODE_SMA;
inputint SLOW_MA_PERIOD=54;
inputint SLOW_MA_SHIFT=0;
// начальные значения StopLoss, TakeProfitinputint STOPLOSS_POINTS=100;
inputint 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:
// верхний фрактал. уровень по которому тралятся sellreturn 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);
}
returnEMPTY_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) returnOP_BUY;
if (data[SIGNAL_SELL][shift]==1.0) returnOP_SELL;
return -1;
}
EA *ea=NULL;
intOnInit()
{
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);
// остальная часть одинакова для всех советников//................
}
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.
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.
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.
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.
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.
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.
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:
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
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.
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.
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.
Como um observador de seu código - difícil.
Concordo, é muito difícil ler seu código, mesmo que você conheça o idioma.