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

 
mladen:
Терранс

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

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

с уважением,

Младен

Привет, Младен, извините, что снова беспокою вас. Я просмотрел свои коды и заметил, что не только TP и SL, но иногда даже ордера на покупку и продажу не работают. Я просмотрел ссылки на урок, который вы дали мне от codersgurus, и это тот же набор учебников, который был у меня и на котором я основывал свои коды. Я серьезно не могу найти причину моей ошибки в кодах.

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

Спасибо и с уважением

Терранс

 

...

Терранс

Во-первых: Является ли ваш брокер ECN/STP? Если да, то вы не можете выставлять стоп лосс и тейк профит вместе с открытием ордера, а должны сначала открыть ордер с установленными на 0 значениями, а затем использовать OrderModify() для установки стоп лосса и/или тейк профита на уже открытый ордер.

Второе: Также всегда проверяйте, не написано ли у вас что-нибудь на вкладке экспертов в окне терминала (проверьте, не написаны ли там ошибки: возможно, тогда вы поймете, что происходит и почему.

Третье : Неплохо было бы поместить такую строку:

int err=GetLastError(); Print(err);

После каждой функции управления заказами. Описания ошибок вы можете найти в файле experts/include/stderror.mqh (есть много ошибок, которые могут произойти (просто посмотрите список возможных кодов ошибок и описаний) с ордерами, и вы должны отслеживать каждую возможную ошибку) С известными кодами ошибок (строка кода выше), вы можете сосредоточиться на исправлении конкретных ошибок, а не гадать, что происходит.

tkuan77:
Привет, Младен, извините, что снова беспокою вас. Я просмотрел свои коды и заметил, что не только TP и SL, но иногда даже ордера на покупку и продажу сбиваются. Я просмотрел ссылки на урок, который вы дали мне от codersgurus, и это тот же набор учебников, который у меня был и на котором я основывал свои коды. Я серьезно не могу найти причину ошибки в кодах.

Пересечение МА работает как надо вместе с длинным и коротким ордером, однако временами вход и выход кажутся безумными, даже когда я сделал базовую функцию ASK для проверки. Пожалуйста, пролейте на это свет.

Спасибо и с уважением

Терранс
Файлы:
terminal_1.gif  62 kb
 
mladen:
Терранс

Во-первых: Является ли ваш брокер ECN/STP? Если да, то вы не можете выставлять стоп-лосс и тейк-профит вместе с открытием ордера, а должны сначала открыть ордер с ними, установленными на 0, а затем использовать OrderModify() для установки стоп-лосса и/или тейк-профита на уже открытый ордер.

Второе: Также всегда проверяйте, не написано ли у вас что-нибудь на вкладке экспертов в окне терминала (проверьте, не написаны ли там ошибки: возможно, тогда вы поймете, что происходит и почему.

В-третьих : Неплохо было бы разместить такую строку:

int err=GetLastError(); Print(err);
После каждой функции управления заказами. Описания ошибок вы можете найти в файле experts/include/stderror.mqh (есть много ошибок, которые могут произойти (просто посмотрите список возможных кодов ошибок и описаний) с заказами, и вы должны отслеживать каждую возможную ошибку) С известными кодами ошибок (строка кода из вышеуказанного), вы можете сосредоточиться на исправлении конкретных ошибок, а не гадать, что происходит.

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

Спасибо, что указал на ECN/STP. Я не знал о них, пока вы не упомянули. Я сделал изменения, как вы предложили, но теперь мне стало только хуже. Мало того, что проблема с входом и выходом сохраняется, так еще и SL пропал. Это сложнее, чем я думал.

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

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,0,Ask+TakeProfit*Point,

"My EA",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,0,Bid-TakeProfit*Point,

"Мой советник",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);

}

for(cnt=0;cnt<total;cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())

{

if(OrderType()==OP_BUY) // длинная позиция открыта

{

OrderClose(OrderTicket(),OrderLots(),Ask-StopLoss*Point,3,Violet);

// закрываем позицию

return(0); // выход

}

else // переходим в короткую позицию

{

OrderClose(OrderTicket(),OrderLots(),Bid+StopLoss*Point,3,Violet);

// закрываем позицию

return(0); // выход

}

}

}

return(0);

}

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

 
mladen:
Терранс

Во-первых: Является ли ваш брокер ECN/STP? Если да, то вы не можете выставлять стоп-лосс и тейк-профит вместе с открытием ордера, а должны сначала открыть ордер с ними, установленными на 0, а затем использовать OrderModify() для установки стоп-лосса и/или тейк-профита на уже открытый ордер.

Второе: Также всегда проверяйте, не написано ли у вас что-нибудь на вкладке экспертов в окне терминала (проверьте, не написаны ли там ошибки: возможно, тогда вы поймете, что происходит и почему.

В-третьих : Было бы неплохо поместить строку вроде этой:

int err=GetLastError(); Print(err);
После каждой функции управления заказами. Описания ошибок вы можете найти в файле experts/include/stderror.mqh (есть много ошибок, которые могут произойти (просто посмотрите список возможных кодов ошибок и описаний) с заказами, и вы должны отслеживать каждую возможную ошибку) С известными кодами ошибок (строка кода из вышеуказанного), вы можете сосредоточиться на исправлении конкретных ошибок, а не гадать, что происходит.

Привет, Младен, я хотел бы поблагодарить тебя за помощь в эти несколько дней. Мне удалось найти ошибку в моем коде, которая вызывает ошибку входа и выхода.

С уважением,

Терранс

 

Открытие более 1 сделки

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

Моя цель проста:

Когда LWMA 10 пересекается ниже LWMA 20, система будет открывать короткие позиции при условии, что и LWMA 10 и 20 пересекаются ниже SMA 50 и наоборот для длинных сделок.

Я хочу ограничить советника, чтобы он открывал не более 2 сделок, однако, когда я меняю коды, он начинает открывать 2 сделки за раз вместо того, чтобы открывать 1 сделку по каждому критерию.

Нужно ли мне установить систему счетчика или что-то еще, или как мне настроить мой счетчик, чтобы он реагировал, когда одна из моих сделок уже достигла TP или SL?

Не мог бы кто-нибудь пролить свет на то, что не так с моими кодами.

Большое спасибо и пожелания

Терранс

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

extern double TakeProfit=500.0;

extern double Lots=0.1;

extern double StopLoss=500.0;

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

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,50,0,MODE_SMA,PRICE_CLOSE,0);

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Мой советник",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);

}

if(total == 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Мой советник",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);

}

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

 

Вопросы

Младен,

Я пытаюсь найти уроки по ссылке, которую вы мне показали, но это общие уроки, я ищу информацию конкретно для индикатора Хендерсона...

Кроме того, я просмотрел размещенные темы и после этого я хочу выяснить следующие вещи.

-Простым и понятным языком, я хочу спросить, что примерно после скольких баров проходит, и цвет меняется.

Другими словами, максимум сколько баров нужно, чтобы цвет линии изменился с голубого на розовый? К сожалению, я не понимаю причудливой терминологии и буду признателен за очень простой ответ, после которого я смогу двигаться дальше и начать стратегию. Любой график будет очень признателен. premalmunshaw@yahoo.com - мой адрес электронной почты.

Я пытаюсь заплатить $39 за активацию этого пакета.

С НЕТЕРПЕНИЕМ ЖДУ ПОЛОЖИТЕЛЬНОГО ОТВЕТА!

С уважением,

Премал Муншоу

mladen:
Честно говоря, я не понимаю, о чем вы спрашиваете.

Если вы спрашиваете, когда меняется цвет, то ответ: когда меняется наклон.

Если вы спрашиваете, как кодируется изменение цвета, то ответ вы должны искать в этом разделе: Уроки.
 

...

К сожалению, я не понимаю ваших вопросов, поэтому все, что я сделаю, это перескажу себя (длина расчета относится к длине расчета фильтра Хендерсона):

если ваша расчетная длина равна 5, то последние 2 бара могут меняться

если ваша расчетная длина равна 7, то последние 3 бара могут измениться

если расчетная длина равна 9, то последние 4 бара могут измениться.

Проще, чем это, ответить невозможно. И нет более простого объяснения того, как рассчитывается фильтр Хендерсона: это как если бы я попытался объяснить преобразование Фурье в терминах "1+1 = 2". Пожалуйста, изучите ссылки, которые вам предоставили.

Что касается остального: вы получили ссылки на математику, лежащую в основе фильтра, вы получили информацию о том, сколько баров пересчитывается, вы даже получили примеры из новостной ленты элитного раздела. Что касается стратегии с использованием этого фильтра: я 1000 раз говорил в 1000-х сообщениях, что пересчитывающие индикаторы (SSA, фильтр Хендерсона, центрированный TMA, преобразования Фурье, регрессионный анализ, ...) должны использоваться не в "сигнальном режиме", а в "режиме оценки". Если вы ищете сигналы от фильтра Хендерсона, то вы на совершенно неверном пути, и если это единственная причина, по которой вы рассматриваете подписку на элитный раздел, то лучше вам не подписываться.

PS: это плохая практика - делать свой email публичным. В этом случае все, что вы получите, это тонну спам сообщений в вашем почтовом ящике.

______________________________________

Желаю вам всего наилучшего в поисках торговой системы.

пожелания

Младен

premalmunshaw:
Младен,

Я пытаюсь найти уроки по ссылке, которую вы мне показали, но это общие уроки, я ищу информацию конкретно для индикатора Хендерсона...

Кроме того, я просмотрел размещенные темы и после этого я хочу выяснить следующие вещи.

-Простым и понятным языком, я хочу спросить, что примерно после скольких баров проходит, и цвет меняется.

Другими словами, максимум сколько баров нужно, чтобы цвет линии изменился с голубого на розовый? К сожалению, я не понимаю причудливой терминологии и буду признателен за очень простой ответ, после которого я смогу двигаться дальше и начать стратегию. Любой график будет очень признателен. premalmunshaw@yahoo.com - мой адрес электронной почты.

Я пытаюсь заплатить $39 за активацию этого пакета.

С НЕТЕРПЕНИЕМ ЖДУ ПОЛОЖИТЕЛЬНОГО ОТВЕТА!

С уважением,

Премал Муншау
 

Младен,

Есть ли способ установить счетчик на мою сделку так, чтобы когда моя сделка имеет TP или SL, я мог вызвать скачок счетчика?

С уважением,

Терранс

tkuan77:
Привет всем, я пытался сделать так, чтобы мой советник мог открывать несколько сделок, но пока мне удается сделать так, чтобы он ограничивался только одной сделкой.

Моя цель проста:

Когда LWMA 10 пересекается ниже LWMA 20, система будет совершать короткие сделки при условии, что и LWMA 10 и 20 пересекаются ниже SMA 50 и наоборот для длинных сделок.

Я хочу ограничить советника, чтобы он открывал не более 2 сделок, однако, когда я меняю коды, он начинает открывать 2 сделки за раз вместо того, чтобы открывать 1 сделку по каждому критерию.

Нужно ли мне установить систему счетчика или что-то еще, или как мне настроить мой счетчик, чтобы он реагировал, когда одна из моих сделок уже достигла TP или SL?

Не мог бы кто-нибудь пролить свет на то, что не так с моими кодами.

Большое спасибо и пожелания

Терранс

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

extern double TakeProfit=500.0;

extern double Lots=0.1;

extern double StopLoss=500.0;

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

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,50,0,MODE_SMA,PRICE_CLOSE,0);

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Мой советник",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);

}

if(total == 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Мой советник",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);

}

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

...

Попробуйте эту функцию:

int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
и затем вы можете проверить
:if openedBuys==0 open buy

if openedSells==0 open sell

tkuan77:
Младен,

Есть ли способ установить счетчик на мою сделку так, чтобы когда моя сделка имеет TP или SL, я мог вызвать скачок счетчика?

С уважением,

Терранс
 

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

Я придумал другой способ, используя функцию "Bars". Когда срабатывает сделка, я устанавливаю целочисленный счетчик с помощью функции bars (например, сделка на покупку срабатывает в баре 122, следовательно, счетчик будет 122) и когда мои критерии срабатывают снова, я снова вызываю функцию bar и сравниваю ее со счетчиком, и сделка срабатывает только если новый счетчик выше предыдущего, который в данном случае равен 122.

Однако я все еще запускаю 2 сделки вместе, а не по одной на каждый критерий. Почему так происходит?

Пожалуйста, помогите

Спасибо и с уважением

Терранс

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

extern double TakeProfit=530.0;

extern double Lots=0.1;

extern double StopLoss=520.0;

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = 0;

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

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

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

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

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,113,0,MODE_EMA,PRICE_CLOSE,0);

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

int BarCounter, BarCounter2;

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

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

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

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

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

BarCounter = Bars;

}

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

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

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

BarCounter = Bars;

}

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

return(0);

}

return(0);

}

if(total == 1)

{

BarCounter2 = Bars;

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma && BarCounter2 > BarCounter)

{

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

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

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

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

BarCounter = BarCounter2;

}

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

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma BarCounter)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

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

BarCounter = BarCounter2;

}

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

return(0);

}

return(0);

}

return(0);

}

mladen:
Попробуйте эту функцию:
int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
и затем вы можете проверить
:if openedBuys==0 open buy

if openedSells==0 open sell