Как кодировать? - страница 297

 

...

Терранс

Вы хотели проверить крест на закрытом баре. Сдвиг 1 означает первый закрытый бар, а сдвиг 2 - первый бар перед ним. И если вы хотите проверить крест на закрытом баре, то вот бары, которые вы должны проверить

Что касается (diff1*diff2)<0) : на самом деле все очень просто

diff1 - это разница между двумя средними на баре 1

diff2 - это разница между двумя средними на баре 2.

Любая может быть положительной или отрицательной. Нас интересует, когда одна из них положительная, а другая отрицательная, потому что это означает, что средние пересеклись. Их умножение дает нам быстрый ответ, есть ли пересечение (если знаки разные, то результат меньше 0, если знаки равны, то результат умножения больше 0).

Надеюсь, это прояснило, что делает этот код.

tkuan77:
Привет, Младен, я попробовал то, что вы мне сказали, и это чудесно работает. Однако я не совсем понимаю логику кодов. Почему вы устанавливаете сдвиг iMA на 1 и 2 и почему вы кодируете это: (diff1*diff2)<0)? Извините, но в настоящее время я все еще нахожусь в процессе обучения.

Спасибо и пожелания

Терранс
 

Как добавить стрелки

Прилагается сокращенная версия советника MA crossover, обсуждавшегося в последних нескольких сообщениях.

Когда пересечение происходит на закрытой свече, эта версия печатает сообщение в лог-файл.

Можно ли заменить логику Print на код для отображения стрелок вверх/вниз на графике?

Спасибо за помощь.

Файлы:
 

...

Попробуйте этот способ ...

Он нарисует стрелку и покажет комментарий в правом нижнем углу графика - вот так (добавил средние на график, чтобы было понятно, что он делает) :

michaelB:
Прилагается сокращенная версия советника MA crossover, обсуждаемого в последних нескольких сообщениях.

Когда пересечение происходит на закрытой свече, эта версия печатает сообщение в лог-файл.

Можно ли заменить логику Print на код для отображения стрелок вверх/вниз на графике?

Спасибо за помощь.
Файлы:
 

Стрелки MA

"2MAcrossover с комментариями" работает очень хорошо.

Только один вопрос - как только стрелка появляется, она исчезает при открытии новой свечи, это было сделано специально?

Мне нравится комментарий в правом нижнем углу графика.

Еще раз спасибо.

 
mladen:
Терранс

Вы хотели проверить наличие креста на закрытом баре. Сдвиг 1 означает первый закрытый бар, а сдвиг 2 - первый бар перед ним. И если вы хотите проверить крест на закрытом баре, то вот бары, которые вы должны проверить

Что касается (diff1*diff2)<0) : это довольно просто.

diff1 - разница между двумя средними на баре 1

diff2 - разница между двумя средними на баре 2

Любое значение может быть положительным или отрицательным. Нас интересует, когда один из них положительный, а другой отрицательный, потому что это означает, что средние пересеклись. Их умножение дает нам быстрый ответ, есть ли пересечение (если знаки разные, то результат меньше 0, если знаки равны, то результат умножения больше 0).

Надеюсь, это прояснило, что делает этот код

Спасибо Младен за помощь! Но когда я добавил этот код, мой советник, кажется, немного сбился. Иногда он самостоятельно устанавливает SL или TP еще до того, как SL или TP будут достигнуты, как показано на моем скриншоте. почему так происходит?

Спасибо и пожелания

Терранс

//--- входные параметры

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

//+------------------------------------------------------------------+

//| функция инициализации эксперта |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| функция деинициализации эксперта | |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

int mainCrossed (double mainline1 , double mainline2)

{

static int mainlast_direction = 0;

static int maincurrent_dirction = 0;

if(mainline1>mainline2)maincurrent_dirction = 1; //main up

if(mainline1<mainline2)maincurrent_dirction = 2; //main down

if(maincurrent_dirction != mainlast_dirction) //main changed

{

mainlast_direction = maincurrent_dirction;

return (mainlast_direction);

}

else

{

return (0);

}

}

//+------------------------------------------------------------------+

//| функция запуска эксперта |

//+------------------------------------------------------------------+

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma, mainshortEma, mainlongEma;

if(Bars<100)

{

Print("баров меньше 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit меньше 10");

return(0); // проверяем TakeProfit

}

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);

int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Мой советник",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Открыт ордер BUY : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера BUY : ",GetLastError());

return(0);

}

if(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print(" Открытордер SELL: ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера SELL : ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

//+------------------------------------------------------------------+

Файлы:
ps.jpg  16 kb
 

Терранс

Этот код не имеет никакого отношения к SL или TP. Он просто тестирует 2 средние на пересечения (см. как michaelB использовал тот же код в своем 2MACrosses, поскольку это тоже советник). Остальная часть вашего кода должна быть пересмотрена для этих ошибок SL и TP.

tkuan77:
Спасибо Младен за помощь! Но когда я добавил этот код, мой советник, кажется, немного сбился. Иногда он самостоятельно устанавливает SL или TP еще до того, как SL или TP будут достигнуты, как показано на моем скриншоте. почему так происходит?

Спасибо и пожелания

Терранс

//--- входные параметры

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

//+------------------------------------------------------------------+

//| функция инициализации эксперта |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| функция деинициализации эксперта | |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

int mainCrossed (double mainline1 , double mainline2)

{

static int mainlast_direction = 0;

static int maincurrent_dirction = 0;

if(mainline1>mainline2)maincurrent_dirction = 1; //main up

if(mainline1<mainline2)maincurrent_dirction = 2; //main down

if(maincurrent_dirction != mainlast_dirction) //main changed

{

mainlast_direction = maincurrent_dirction;

return (mainlast_direction);

}

else

{

return (0);

}

}

//+------------------------------------------------------------------+

//| функция запуска эксперта |

//+------------------------------------------------------------------+

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma, mainshortEma, mainlongEma;

if(Bars<100)

{

Print("баров меньше 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit меньше 10");

return(0); // проверяем TakeProfit

}

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);

int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Мой советник",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Открыт ордер BUY : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера BUY : ",GetLastError());

return(0);

}

if(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Открыт ордер SELL : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера SELL : ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

//+------------------------------------------------------------------+
 

...

Да, это намеренно.

Поскольку вы сделали советника, а не индикатор, добавление было сделано для того, чтобы показывать только последний активный крест, а когда нет активного креста, не показывать стрелку. Чтобы сделать его способным показывать несколько стрелок, его нужно сначала преобразовать в индикатор, а затем переписать все, но я думаю, что уже есть много индикаторов, которые показывают средние крестики на графике.

michaelB:
"2MAcrossover with comments" работает действительно хорошо.

Один вопрос - когда стрелка появляется, она исчезает при открытии новой свечи, это было сделано специально?

Мне нравится комментарий в правом нижнем углу графика.

Еще раз спасибо.
 
mladen:
Terrance Этот код не имеет никакого отношения к SL или TP. Он просто тестирует 2 средние для кроссов (см. как michaelB использовал тот же код в своем 2MACrosses, поскольку это тоже советник). Остальная часть вашего кода должна быть пересмотрена для этих ошибок SL и TP.

Привет, Младен,

Вы имеете в виду, что я неправильно устанавливаю TP и SL?

С уважением,

Терранс

 

...

Терранс

Вы видели этот раздел TSD : Уроки?

Я думаю, что на многие вопросы там уже есть ответы и там можно найти очень хорошие примеры для общего написания советника. Что касается вашего вопроса: я не тестировал ваш советник, поэтому не знаю. Проблема тестирования чужого советника заключается в том, что нужно знать его идею и логику, а во многих случаях это просто невозможно "прочитать" из самого кода. Фрагмент кода, о котором мы говорили, касался того, как обнаружить 2 пересечения средних на закрытом баре, и этот код делает только это и ничего кроме этого. Вот почему я сказал, что "это не имеет ничего общего с SL или TP".

с уважением,

Младен

tkuan77:
Привет Младен,

Вы имеете в виду, что я неправильно устанавливаю TP и SL?

С уважением,

Терранс
 

Уроки MQL

mladen - спасибо за ссылку!!!