только подумал, подумал и добавил и для покупки. Ведь ордера будут закрываться не только по BUY но и по SHELL.
Функцию isCloseLasPosByTake() вставил в конце, при компиляции получилось
2;116;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;104:33;'(' - function definition unexpected
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:7;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:14;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:27;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:33;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:15;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:37;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:17;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:46;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;116:19;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;117:17;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;127:19;'sy' - variable not defined
вот такие пироги, или кок говаривал п/п-к ГОЦМАН картина маслом. Подмогните чайнику....непетрю ничаго.......
ааа сам код(т. е. только ф-я старт)
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start(){//----// Узнаем уровень стопов и спрэдint Spread =MarketInfo(Symbol(),MODE_SPREAD);int StopLevel =MarketInfo(Symbol(),MODE_STOPLEVEL);// Рассчитываем значения средних на 0-ом и 1-ом барахdouble MAF_0 =iMA(NULL,0, MAFP,0,1,1,0);double MAF_1 =iMA(NULL,0, MAFP,0,1,1,1);double MAS_0 =iMA(NULL,0, MASP,0,1,1,0);double MAS_1 =iMA(NULL,0, MASP,0,1,1,1);// открытие позиции Buy покупкаif(MAF_1 < MAS_1 && MAF_0 > MAS_0)if( isCloseLastPosByTake(NULL,OP_SELL,MagicNumber)==true){//покупаемif(CheckOrders(OP_SELL)){if(StopLoss <= StopLevel+Spread)double SL =0;else
SL =Ask- StopLoss*Point;if(TakeProfit <= StopLevel-Spread)double TP =0;else
TP =Ask+ TakeProfit*Point;if(!OrderSend(Symbol(),OP_BUY, Lots,Ask,5, SL, TP,NULL, MagicNumber))Print("Не открыт ордер Buy. Ошибка №",GetLastError());}// Открытие позиции Sell продажа if(MAF_1 > MAS_1 && MAF_0 < MAS_0)if( isCloseLastPosByTake(NULL,OP_BUY,MagicNumber)==true){//продаемif(CheckOrders(OP_BUY)){if(StopLoss <= StopLevel+Spread)
SL =0;else
SL =Bid+ StopLoss*Point;if(TakeProfit <= StopLevel-Spread)
TP =0;else
TP =Bid- TakeProfit*Point;if(!OrderSend(Symbol(),OP_SELL, Lots,Bid,5, SL, TP,NULL, MagicNumber))Print("Не открыт ордер Sell. Ошибка №",GetLastError());}bool isCloseLastPosByTake(string sy=NULL,int op=-1,int mn=-1){datetime t;double ocp, otp;int dg, i, j=-1, k=OrdersHistoryTotal();if(sy=="0")sy=Symbol();for(i=0; i<k; i++){if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if(OrderSymbol()== sy || sy==NULL){if(OrderType()==OP_BUY||OrderType()==OP_SELL){if(op<0||OrderType()== op){if(mn<0||OrderMagicNumber()== mn){if(t<OrderCloseTime()){
t=OrderCloseTime();
j=i;}}}}}}}if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)){
dg=MarketInfo(sy,MODE_DIGITS);if(dg==0)if(StringFind(OrderSymbol(),"JPY")<0) dg=4;else dg=2;
ocp=NormalizeDouble(OrderClosePrice(), dg);
otp=NormalizeDouble(OrderTakeProfit(), dg);if(ocp==otp)return(True);}return(False);}//----return(0);}//+------------------------------------------------------------------+
Я же специально писал в своем сообщении. Что эту функцию isCloseLastPosByTake() - надо ставить в самый конец кода, ВНЕ ФУНКЦИИ СТАРТ !
А ты её куда воткнул ?
И внимательнее с фигурными скобками в условиях продажи и условиях покупки. Там у тебя их явно не хватает (проверяй - чтобы число открытых скобок равнялось числу закрытых). Вот исправил продажу :
// ----- Открытие позиции Sell продажа------------ if(MAF_1 > MAS_1 && MAF_0 < MAS_0){if( isCloseLastPosByTake(NULL,OP_BUY,MagicNumber)==true){if(CheckOrders(OP_BUY)){if(StopLoss <= StopLevel+Spread)
SL =0;else SL =Bid+ StopLoss*Point;if(TakeProfit <= StopLevel-Spread)
TP =0;else TP =Bid- TakeProfit*Point;if(!OrderSend(Symbol(),OP_SELL, Lots,Bid,5, SL, TP,NULL, MagicNumber))Print("Не открыт ордер Sell. Ошибка №",GetLastError());}}}//---конец блока продажи ------------------------------
Но вот в чем моя проблема у меня есть советник на основе мартина он выставляет первый ордер SELL или BUY, такой какой он хочет, а мне хотелось бы чтоб я сам мог выбирать BUY или SELL в свойствах советника. Т.е. я поставил в свойствах например BUY и он открывает ордер только BUY, или наоборот.
Программировать на MQL4 к сожалению пока не научился.
Я же специально писал в своем сообщении. Что эту функцию isCloseLastPosByTake() - надо ставить в самый конец кода, ВНЕ ФУНКЦИИ СТАРТ !
А ты её куда воткнул ?
И внимательнее с фигурными скобками в условиях продажи и условиях покупки. Там у тебя их явно не хватает (проверяй - чтобы число открытых скобок равнялось числу закрытых). Вот исправил продажу :
Я её воткнул после ф-ии старт, я так понял.....
Значит неправильно понял, благодарю за подзатыльник :-))
Если правильно понял, то её надо ставить после } в конце блока expert deinitialization function ??????? или после return(0); в самом конце ф-ии старт???????
Значит неправильно понял, благодарю за подзатыльник :-))
Если правильно понял, то её надо ставить после } в конце блока expert deinitialization function ??????? или после return(0); в самом конце ф-ии старт???????
Заранее спасибо за терпение!!!!!!!!!
Её нужно ставить снаружи. Не внутри какой-ниб . функции, - а как отдельную самостоятельную функцию.
Вот так :
int start(){//----// Узнаем уровень стопов и спрэдint Spread =MarketInfo(Symbol(),MODE_SPREAD);int StopLevel =MarketInfo(Symbol(),MODE_STOPLEVEL);// Рассчитываем значения средних на 0-ом и 1-ом барахdouble MAF_0 =iMA(NULL,0, MAFP,0,1,1,0);double MAF_1 =iMA(NULL,0, MAFP,0,1,1,1);double MAS_0 =iMA(NULL,0, MASP,0,1,1,0);double MAS_1 =iMA(NULL,0, MASP,0,1,1,1);// открытие позиции Buy покупкаif(MAF_1 < MAS_1 && MAF_0 > MAS_0){if( isCloseLastPosByTake(NULL,OP_SELL,MagicNumber)==true){if(CheckOrders(OP_SELL)){if(StopLoss <= StopLevel+Spread)double SL =0;else SL =Ask- StopLoss*Point;if(TakeProfit <= StopLevel-Spread)double TP =0;else TP =Ask+ TakeProfit*Point;if(!OrderSend(Symbol(),OP_BUY, Lots,Ask,5, SL, TP,NULL, MagicNumber))Print("Не открыт ордер Buy. Ошибка №",GetLastError());}}}//-------------------Конец покупки -----------------------// ----- Открытие позиции Sell продажа------------ if(MAF_1 > MAS_1 && MAF_0 < MAS_0){if( isCloseLastPosByTake(NULL,OP_BUY,MagicNumber)==true){if(CheckOrders(OP_BUY)){if(StopLoss <= StopLevel+Spread)
SL =0;else SL =Bid+ StopLoss*Point;if(TakeProfit <= StopLevel-Spread)
TP =0;else TP =Bid- TakeProfit*Point;if(!OrderSend(Symbol(),OP_SELL, Lots,Bid,5, SL, TP,NULL, MagicNumber))Print("Не открыт ордер Sell. Ошибка №",GetLastError());}}}//---конец блока продажи ------------------------------//----return(0);}//+----------КОНЕЦ ФУНКЦИИ СТАРТ -------------------+//ЖЖЖЖЖЖЖ Другие вызываемые пользовательские функции ЖЖЖЖЖЖ//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.05.2008 |//| Описание : Возвращает флаг закрытия |//| последней позиции по тейку. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+bool isCloseLastPosByTake(string sy="",int op=-1,int mn=-1){datetime t;double ocp, otp;int dg, i, j=-1, k=OrdersHistoryTotal();if(sy=="0") sy=Symbol();for(i=0; i<k; i++){if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if(OrderSymbol()==sy || sy==""){if(OrderType()==OP_BUY||OrderType()==OP_SELL){if(op<0||OrderType()==op){if(mn<0||OrderMagicNumber()==mn){if(t<OrderCloseTime()){
t=OrderCloseTime();
j=i;}}}}}}}if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)){
dg=MarketInfo(sy,MODE_DIGITS);if(dg==0)if(StringFind(OrderSymbol(),"JPY")<0) dg=4;else dg=2;
ocp=NormalizeDouble(OrderClosePrice(), dg);
otp=NormalizeDouble(OrderTakeProfit(), dg);if(ocp==otp)return(True);}return(False);}
Не уверен, что при таких условиях советник будет работать. Т.к. самая первая позиция не сможет открыться...
Нужно убрать ф-ю Функция isCloseLastPosByTake() или из условия для покупки, или из условий для продажи.
Но вот в чем моя проблема у меня есть советник на основе мартина он выставляет первый ордер SELL или BUY, такой какой он хочет, а мне хотелось бы чтоб я сам мог выбирать BUY или SELL в свойствах советника. Т.е. я поставил в свойствах например BUY и он открывает ордер только BUY, или наоборот.
Сам советник прикрепляю.
Заранее спасибо всем, кто откликнется!!!
Вряд ли, кто откликнется. Советник декомпеллированный (взломанный) и такие файлы здесь не приветствуются...
Решил изучить MQL 4 т.к. все найденное не соответствует моим чаяниям. Сейчас разбираюсь вчужом советнике, что бы понять как работают профессионалы и слегка улучшить его под свою идею. Там есть (простая и небольшая, на одну страницу) пользовательская функция код ее прилагаю. По причине своей чайниковости два дня не могупонять - что вернет эта функция в результате, и к какому вложенному условию приналежит Еlse?-когда оно сработает?
Пожелает ли кто-нибудь заронить искру знаний в мою дремучесть?
У меня получается следующее:
Цель всей ф-и- определить есть ли уже выставленный ордер по данной паре и если есть определить его тип.
Функция запустившая данную функцию ждет, что при наличии одного и ордеров, выбранных в процедуре switch,функция должная вернуть значение «1», при наличии двухордеров - «2» и при отсутствии ордеров «-1».
Цикл запускается приl_pos_16 = 0. Допустим всего по нескольким парам имеется четыре отложенных ордера,в том числе два по паре, в которой работает советник и они не первые.
Однако у меня получается, что при первой итерации цикла функция if(OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) будет проверять в списке ордеров позицию с номером «0», но такой позиции нет, (т.к я понимаю нумерация идет с позиции №1) и тогда будет передача на elseс полным выходом из fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12) с возвратом значенияReturn(-1).
В моем понимании смысл всей функции теряется т.к. независимоот наличия или отсутствия ордеров по данной паре результат должен быть один.
Однако при работе советника эта функция определяет и дает то, что ждет от нее вызвавшая функция, которая далее работает в зависимости от полученного результата.
Так же никак не могу понять elseReturn(-1) сработает в
if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {
Возможно, поможет функция https://www.mql5.com/ru/forum/107476/page21
Функция isCloseLastPosByTake().
Эта функция возвращает флаг закрытия последней позиции по тейку.
Флаг поднят - True - сработал TakeProfit.
Флаг опущен - False - позиция была закрыта по другой причине.
Саму функцию ставить в самом конце кода. А в условия для продажи добавить :
Доброго дня,вечера или утра всем ВАМ.
Всё сделал как rid писал. Функцию вставил в самый конец кода, в условия для продажи добавил
только подумал, подумал и добавил и для покупки. Ведь ордера будут закрываться не только по BUY но и по SHELL.
Функцию isCloseLasPosByTake() вставил в конце, при компиляции получилось
2;116;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;104:33;'(' - function definition unexpected 2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:7;'sy' - variable not defined 2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:14;'sy' - variable not defined 2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:27;'sy' - variable not defined 2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:33;'sy' - variable not defined 2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:15;'op' - variable not defined 2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:37;'op' - variable not defined 2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:17;'mn' - variable not defined 2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:46;'mn' - variable not defined 2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;116:19;'t' - variable not defined 2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;117:17;'t' - variable not defined 2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;127:19;'sy' - variable not definedвот такие пироги, или кок говаривал п/п-к ГОЦМАН картина маслом. Подмогните чайнику....непетрю ничаго.......
ааа сам код(т. е. только ф-я старт)
Я же специально писал в своем сообщении. Что эту функцию isCloseLastPosByTake() - надо ставить в самый конец кода, ВНЕ ФУНКЦИИ СТАРТ !
А ты её куда воткнул ?
И внимательнее с фигурными скобками в условиях продажи и условиях покупки. Там у тебя их явно не хватает (проверяй - чтобы число открытых скобок равнялось числу закрытых). Вот исправил продажу :
Добрый день!!!
Нужна помощь. Извиняюсь за не скромность.
Но вот в чем моя проблема у меня есть советник на основе мартина он выставляет первый ордер SELL или BUY, такой какой он хочет, а мне хотелось бы чтоб я сам мог выбирать BUY или SELL в свойствах советника. Т.е. я поставил в свойствах например BUY и он открывает ордер только BUY, или наоборот.
Программировать на MQL4 к сожалению пока не научился.
Сам советник прикрепляю.
Заранее спасибо всем, кто откликнется!!!
Я же специально писал в своем сообщении. Что эту функцию isCloseLastPosByTake() - надо ставить в самый конец кода, ВНЕ ФУНКЦИИ СТАРТ !
А ты её куда воткнул ?
И внимательнее с фигурными скобками в условиях продажи и условиях покупки. Там у тебя их явно не хватает (проверяй - чтобы число открытых скобок равнялось числу закрытых). Вот исправил продажу :
Я её воткнул после ф-ии старт, я так понял.....
Значит неправильно понял, благодарю за подзатыльник :-))
Если правильно понял, то её надо ставить после } в конце блока expert deinitialization function ??????? или после return(0); в самом конце ф-ии старт???????
Заранее спасибо за терпение!!!!!!!!!
Я её воткнул после ф-ии старт, я так понял.....
Значит неправильно понял, благодарю за подзатыльник :-))
Если правильно понял, то её надо ставить после } в конце блока expert deinitialization function ??????? или после return(0); в самом конце ф-ии старт???????
Заранее спасибо за терпение!!!!!!!!!
Её нужно ставить снаружи. Не внутри какой-ниб . функции, - а как отдельную самостоятельную функцию.
Вот так :
Не уверен, что при таких условиях советник будет работать. Т.к. самая первая позиция не сможет открыться...
Нужно убрать ф-ю Функция isCloseLastPosByTake() или из условия для покупки, или из условий для продажи.
Тогда советник заработает.
Добрый день!!!
Но вот в чем моя проблема у меня есть советник на основе мартина он выставляет первый ордер SELL или BUY, такой какой он хочет, а мне хотелось бы чтоб я сам мог выбирать BUY или SELL в свойствах советника. Т.е. я поставил в свойствах например BUY и он открывает ордер только BUY, или наоборот.
Сам советник прикрепляю.
Заранее спасибо всем, кто откликнется!!!
Вряд ли, кто откликнется. Советник декомпеллированный (взломанный) и такие файлы здесь не приветствуются...
WinExec("C:\\Program Files\\Opera\\opera.exe http://www.mail.ru",2);Всем привет! Это запуск ссылки конкретным браузером, а как запустить эту же ссылку по умолчанию?Тоесть браузером который стоит по умолчанию
ShellExecute, команда "open", емнип.
Решил изучить MQL 4 т.к. все найденное не соответствует моим чаяниям. Сейчас разбираюсь в чужом советнике, что бы понять как работают профессионалы и слегка улучшить его под свою идею. Там есть (простая и небольшая, на одну страницу) пользовательская функция код ее прилагаю. По причине своей чайниковости два дня не могу понять - что вернет эта функция в результате, и к какому вложенному условию приналежит Еlse?-когда оно сработает?
Пожелает ли кто-нибудь заронить искру знаний в мою дремучесть?
У меня получается следующее:
Цель всей ф-и - определить есть ли уже выставленный ордер по данной паре и если есть определить его тип.
Функция запустившая данную функцию ждет, что при наличии одного и ордеров, выбранных в процедуре switch, функция должная вернуть значение «1», при наличии двух ордеров - «2» и при отсутствии ордеров «-1».
Цикл запускается при l_pos_16 = 0. Допустим всего по нескольким парам имеется четыре отложенных ордера, в том числе два по паре, в которой работает советник и они не первые.
Однако у меня получается, что при первой итерации цикла функция if(OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) будет проверять в списке ордеров позицию с номером «0», но такой позиции нет, (т.к я понимаю нумерация идет с позиции №1) и тогда будет передача на else с полным выходом из fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12) с возвратом значения Return(-1).
В моем понимании смысл всей функции теряется т.к. независимо от наличия или отсутствия ордеров по данной паре результат должен быть один.
Однако при работе советника эта функция определяет и дает то, что ждет от нее вызвавшая функция, которая далее работает в зависимости от полученного результата.
Так же никак не могу понять else Return(-1) сработает в
if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {
Или же в составе if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {
КОД функции :
int fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12)
a_count_0 = 0;
a_count_4 = 0;
a_count_8 = 0;
a_count_12 = 0;
gi_252 = 0;
for (int l_pos_16 = 0; l_pos_16 < OrdersTotal(); l_pos_16++) {
if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {
switch (OrderType()) case OP_BUY:
a_count_0++;
gi_252 = 1;
g_ticket_268 = OrderTicket();
gs_272 = OrderComment();
g_ord_open_price_256 = OrderOpenPrice();
g_ord_stoploss_288 = OrderStopLoss();
g_ord_takeprofit_296 = OrderTakeProfit();
break;
case OP_SELL:
a_count_4++;
gi_252 = -1;
g_ticket_268 = OrderTicket();
gs_272 = OrderComment();
g_ord_open_price_256 = OrderOpenPrice();
g_ord_stoploss_288 = OrderStopLoss();
g_ord_takeprofit_296 = OrderTakeProfit();
break;
case OP_BUYSTOP:
a_count_8++;
break;
case OP_SELLSTOP:
a_count_12++;
}
}
} else return (-1);
}
return (a_count_0 + a_count_4 + a_count_8 + a_count_12);
/*при нормальном выполнении ф-и будет возвращена единица в переменной в одном из case и «0» во всех остальных, что указывает, что есть один из
типов ордера и при этом вызвавшей функции доступен номер этого ордера,
комментарий, цена открытия, стоп лосс и тайк профит */
}