Впрочем на вопрос: возможно ли закрыть ВСЕ позиции ?
да можно, последовательно друг за другом, скриптом это быстро, аап! и всё...
.........................
Этим я сейчас и пользуюсь. Набор скриптов - пользуешь то этот, то тот... А вот попробовал закодировать свою стратегию в эксперт и столкнулся с рядом трудностей.
gince>>: Тут у меня что то неработает это означаеи что незакрывает Ошибок невыбрасывает
В функции ClosePositions(), своей библиотеки b-Positions.mqh, KimIV использует вызов другой своей функции ClosePosBySelect() которая запрещает использование ee в тестере :
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
Для тестов на истории используй его библиотеку b-ForTest.mqh
В функции ClosePositions(), своей библиотеки b-Positions.mqh, KimIV использует вызов другой своей функции ClosePosBySelect() которая запрещает использование ee в тестере :
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
Для тестов на истории используй его библиотеку b-ForTest.mqh
Вы неправильно поняли мой код... Перевожу на русский... Если НЕ тестовый режим И (эксперту НЕ разрешено торговать ИЛИ советники остановлены), тогда прервать цикл. Если сказать совсем просто, то данная строка обеспечивает выход из цикла при отжатии кнопки "Советники" на панели инструментов.
С массивом, к сожалению, тоже неувязка...При коде подсчёта ордеров, с условием если лотов больше 0 (Lts>0), лоты закрываются по одному (по условию достижения профита), хотя нужно чтобы учитывался суммарный профит:
int Tip;// Тип ордераint Ticket=0,// Номер ордера
Tkt;// Количество номеров ордеровdouble Lot=0,// Количество закр. лотов
Lts;// Количество лотов всегоdouble Price_Cls;// Цена закрытия ордераint Errors;//--------------------------------------------------------------- 3 --for(int mm=1; mm<=Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам{if(Mas_Ord_Tek[mm][6]==Tip &&// Среди ордеров нашего типа
Mas_Ord_Tek[mm][5]>Lot &&// .. выбираем лоты
Mas_Ord_Tek[mm][4]>Ticket)// .. выбираем номер ордера{// Этот больше ранее найден.
Lts=Mas_Ord_Tek[mm][5]+Lot;
Tkt=Mas_Ord_Tek[mm][4]+Ticket;}}if(Tip==0) Price_Cls=Bid;// Для ордеров Buyif(Tip==1) Price_Cls=Ask;// Для ордеров Sellif(BuyOrdProf>100&& Lts>0)
Ans=OrderClose(Tkt,Lts,Price_Cls,0,Red);// Закрыть все ордера
А при условии в подсчёте ордеров, если лотов больше 1 (Lts>1), лоты не закрываются:
int Tip;// Тип ордераint Ticket=0,// Номер ордера
Tkt;// Количество номеров ордеровdouble Lot=0,// Количество закр. лотов
Lts;// Количество лотов всегоdouble Price_Cls;// Цена закрытия ордераint Errors;//--------------------------------------------------------------- 3 --for(int mm=1; mm<=Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам{if(Mas_Ord_Tek[mm][6]==Tip &&// Среди ордеров нашего типа
Mas_Ord_Tek[mm][5]>Lot &&// .. выбираем лоты
Mas_Ord_Tek[mm][4]>Ticket)// .. выбираем номер ордера{// Этот больше ранее найден.
Lts=Mas_Ord_Tek[mm][5]+Lot;
Tkt=Mas_Ord_Tek[mm][4]+Ticket;}}if(Tip==0) Price_Cls=Bid;// Для ордеров Buyif(Tip==1) Price_Cls=Ask;// Для ордеров Sellif(BuyOrdProf>100&& Lts>1)
Ans=OrderClose(Tkt,Lts,Price_Cls,0,Red);// Закрыть все ордера
Подскажите кто видит ошибку.
Или, может, Игорь, у меня неправильное понимание использования Вашей функции?
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Вызов функции
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает суммарный профит открытых позиций в валюте депозита |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+double GetProfitOpenPosInCurrency(string sy="",int op=-1,int mn=-1){double p=0;int i, k=OrdersTotal();if(sy=="0") sy=Symbol();for(i=0; i<k; i++){if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){if((OrderSymbol()==sy || sy=="")&&(op<0||OrderType()==op)){if(OrderType()==OP_BUY||OrderType()==OP_SELL){if(mn<0||OrderMagicNumber()==mn){
p+=OrderProfit()+OrderCommission()+OrderSwap();}}}}}return(p);}
Игорь, подскажите, пожалуйста, как мне вставить Вашу функцию PriceOpenLastPos в индикатор.
При компиляции редактор выдает ошибку на первую скобку и последующие переменные.
double PriceOpenLastPos(string sy="", int op=-1, int mn=-1) { datetime t; double r=0; int k=OrdersTotal();
if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderOpenTime()) { t=OrderOpenTime(); r=OrderOpenPrice(); } } } } } } } return(r); } }
'(' - function definition unexpected D:\MT4\experts\indicators\Astrea.mq4 (627, 24) 'sy' - variable not defined D:\MT4\experts\indicators\Astrea.mq4 (632, 7) и т.д.
Логику формирования торговых сигналов я реализую в индикаторе, а в советник через глобальную переменную отправляю уже сформированный сигнал открытия\закрытия ордеров.
Для принятия некоторых решений мне нужна цена открытия ордера, вот я и пытаюсьрешить эту проблему. У меня индикатор - динамический, можно отлаживать только в демо, или в тесторе в режиме визуализации.
Angela, компилятор не ожидал именно в этом месте встретить определение моей функции. Это значит, что где-то выше по коду у Вас чего-то нет. Может быть точки с запятой или закрывающей фигурной скобки. Вообщем, проверяйте внимательно код.
kombat 17.07.2009 22:13
Суммируем, получаем сумлот бай 3 лота и выставляем встречный этого обьёма селл 3 лота
.......................
Как вариант - да. Хотя если уже имеются открытые ордера селл, то эксперт может закрыть не те, что тебе нужны. Хотя и это решаемо.
kombat 17.07.2009 22:13
Впрочем на вопрос: возможно ли закрыть ВСЕ позиции ?
да можно, последовательно друг за другом, скриптом это быстро, аап! и всё...
.........................
Этим я сейчас и пользуюсь. Набор скриптов - пользуешь то этот, то тот... А вот попробовал закодировать свою стратегию в эксперт и столкнулся с рядом трудностей.
Тут у меня что то неработает это означаеи что незакрывает Ошибок невыбрасывает
В функции ClosePositions(), своей библиотеки b-Positions.mqh, KimIV использует вызов другой своей функции ClosePosBySelect() которая запрещает использование ee в тестере :
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
Для тестов на истории используй его библиотеку b-ForTest.mqh
В функции ClosePositions(), своей библиотеки b-Positions.mqh, KimIV использует вызов другой своей функции ClosePosBySelect() которая запрещает использование ee в тестере :
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
Для тестов на истории используй его библиотеку b-ForTest.mqh
Вы неправильно поняли мой код... Перевожу на русский... Если НЕ тестовый режим И (эксперту НЕ разрешено торговать ИЛИ советники остановлены), тогда прервать цикл. Если сказать совсем просто, то данная строка обеспечивает выход из цикла при отжатии кнопки "Советники" на панели инструментов.
Вечер добрый,
С массивом, к сожалению, тоже неувязка...При коде подсчёта ордеров, с условием если лотов больше 0 (Lts>0), лоты закрываются по одному (по условию достижения профита), хотя нужно чтобы учитывался суммарный профит:
А при условии в подсчёте ордеров, если лотов больше 1 (Lts>1), лоты не закрываются:
Подскажите кто видит ошибку.
Или, может, Игорь, у меня неправильное понимание использования Вашей функции?
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Вызов функции
Игорь, подскажите, пожалуйста, как мне вставить Вашу функцию PriceOpenLastPos в индикатор.
При компиляции редактор выдает ошибку на первую скобку и последующие переменные.
double PriceOpenLastPos(string sy="", int op=-1, int mn=-1) {
datetime t;
double r=0;
int k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) {
t=OrderOpenTime();
r=OrderOpenPrice();
}
}
}
}
}
}
}
return(r);
}
}
'(' - function definition unexpected D:\MT4\experts\indicators\Astrea.mq4 (627, 24)
'sy' - variable not defined D:\MT4\experts\indicators\Astrea.mq4 (632, 7)
и т.д.
Логику формирования торговых сигналов я реализую в индикаторе, а в советник через глобальную переменную отправляю уже сформированный сигнал открытия\закрытия ордеров.
Для принятия некоторых решений мне нужна цена открытия ордера, вот я и пытаюсьрешить эту проблему. У меня индикатор - динамический, можно отлаживать только в демо, или в тесторе в режиме визуализации.
Картина складывается такая, что учитывается не суммарная прибыль, а прибыль раздельных ордеров.
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Вызов функции
Неправильная передача параметров в функцию. Надо так:
BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);Неправильная передача параметров в функцию. Надо так:
Добавление привязки к символу в вызове функции не помогает. Почему он считает профит для каждой позиции отдельно (рисунок выше)?