Подскажите такую вещь, есть на счете N советников которые при определенных условиях могут все сразу в одно время открыть ордер, стоит в каждом проверка не большего 1 ордера на счете, но в итоге иногда получаю N ордеров, что можно сделать?
Обратиться туда, там наверняка угадают причину и дистанционно внушат решение ;)
Подскажите такую вещь, есть на счете N советников которые при определенных условиях могут все сразу в одно время открыть ордер, стоит в каждом проверка не большего 1 ордера на счете, но в итоге иногда получаю N ордеров, что можно сделать?
Уверены, что на этом участке кода собака порылась? Из того, что вы показали сложно сделать выводы - много неизвестных переменных и не видно самого открытия.
Чтобы найти причину самостоятельно, принтуйте или выводите на экран комментариями значения переменных. Тогда сможете видеть их значения в любой момент времени.
Основа - советник eOpenByTime от уважаемого мистера Кима. Мною добавлен выдранный также из чужого советника трейлинг-стоп, закрытие сделок по окончании недели и открытие сделки в определенный день недели. В данном виде советник работает как надо.
Открытие сделки происходит следующим образом, мною добавлен только день недели открытия сделки, но тут вроде накосячить негде
if (DayOfWeek()==DayOfWeekOpen
&& TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen)
&& TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen)+Duration)
{
if (!ExistPositions("", Sell, MagicNumber)) {
double sl, tp;
if (Sell) {
if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
} else {
if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
}
OpenPosition("", Sell, Lots, sl, tp, MagicNumber);
}
}
Если честно, я не совсем понимаю, почему сравнивается TimeCurrent с TimeCurrent + TimeTradeOpen, где TimeTradeOpen - внешний параметр вида TimeTradeOpen = "19:51". (Это, собственно, и есть нужное нам время открытия позиции.) И почему это сравнение работает, тоже не понимаю. Duration - это время, в течение которого советник будет пытаться открыть позицию.
По абсолютной аналогии я добавил закрытие позиции в пятницу, само закрытие также вычитано на просторах интернетов.
if (DayOfWeek()==DayOfWeekClose
&& TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeClose)
&& TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeClose)+Duration)
{ if (OrdersTotal()>0)
{ for (int i=OrdersTotal()-1; i>=0; i--)
{ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderType()==OP_BUY)
{ RefreshRates();
OrderClose(OrderTicket(),OrderLots(),Bid,1000);
return(0);
}
if (OrderType()==OP_SELL)
{ RefreshRates();
OrderClose(OrderTicket(),OrderLots(),Ask,1000);
return(0);
}
}
} } }
Пока все работало.
Затем я захотел добавить условие, которое смотрит на свечку в заданное время и заданный день недели, если свечка бычья, то продаем, если медвежья - покупаем.
Аналогично скопировал вот эти 3 строчки, которые до этого работали, но сейчас почему-то не хотят.
if (DayOfWeek()==DayOfWeekIf
&& TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeIf)
&& TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeIf)+Duration)
{
if (iClose("XAUUSD",PERIOD_H1,0)-iOpen("XAUUSD",PERIOD_H1,0)>=0)
Sell = true;
if (iOpen("XAUUSD",PERIOD_H1,0)-iClose("XAUUSD",PERIOD_H1,0)>0)
Sell =false;
}
После этого уже идет код открытия позиции. TimeTradeIf имеет аналогичный формат TimeTradeIf = "19:51" и также задается через внешние параметры.
Основа - советник eOpenByTime от уважаемого мистера Кима. Мною добавлен выдранный также из чужого советника трейлинг-стоп, закрытие сделок по окончании недели и открытие сделки в определенный день недели. В данном виде советник работает как надо.
Открытие сделки происходит следующим образом, мною добавлен только день недели открытия сделки, но тут вроде накосячить негде
Если честно, я не совсем понимаю, почему сравнивается TimeCurrent с TimeCurrent + TimeTradeOpen, где TimeTradeOpen - внешний параметр вида TimeTradeOpen = "19:51". (Это, собственно, и есть нужное нам время открытия позиции.) И почему это сравнение работает, тоже не понимаю. Duration - это время, в течение которого советник будет пытаться открыть позицию.
По абсолютной аналогии я добавил закрытие позиции в пятницу, само закрытие также вычитано на просторах интернетов.
Пока все работало.
Затем я захотел добавить условие, которое смотрит на свечку в заданное время и заданный день недели, если свечка бычья, то продаем, если медвежья - покупаем.
Аналогично скопировал вот эти 3 строчки, которые до этого работали, но сейчас почему-то не хотят.
После этого уже идет код открытия позиции. TimeTradeIf имеет аналогичный формат TimeTradeIf = "19:51" и также задается через внешние параметры.
Весь код довольно длинный, нужно вставлять?
Честно говоря, я уже и забыл в чём там у вас проблема. Вот в этом участке кода вижу, что проверяется только наличие коротких позиций и открытие тоже только коротких позиций прописано:
if (!ExistPositions("", Sell, MagicNumber)) { // вместо Sell должно быть OP_SELL или 1double sl, tp;
if (Sell) {
if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
}
else { // Это расчёт для OP_BUY - зачем он тут?if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
}
OpenPosition("", Sell, Lots, sl, tp, MagicNumber); // вместо Sell должно быть OP_SELL или 1
} // ну и, если нужен Buy, то OP_BUY или 0
Честно говоря, я уже и забыл в чём там у вас проблема. Вот в этом участке кода вижу, что проверяется только наличие коротких позиций и открытие тоже только коротких позиций прописано:
Артем, все зесь верно, переменная Sell внешняя, и несет в себе значение true или false, 1 или 0 соответственно,
Если он скинул бы функцию start() и переменные, что они в себе несут, тогда можно что-то подсказать.
Суть такая: если в определенный день DayOfWeekIf в определенное время TimeTradeIf свеча бычья, то Sell = true (продаем), если медвежья, то Sell = false (покупаем).
Так должно быть, но на тесте получаю сделки только на продажу.
eOpenByTime позволяет открывать сделку в заданное время, я добавил еще в заданный день недели if (DayOfWeek()==DayOfWeekOpen, где DayOfWeekOpen = 1,2,3,4,5
Прикрепляю код двумя частями, по-другому не влезает, проблемное условие выделил. Без него все работает как надо, то есть Sell задаем внешне и в нужный день недели в нужное время открывается сделка в нужном направлении.
Вырезал только трал.
//+----------------------------------------------------------------------------+
//| e-OpenByTime.mq4 |
//| |
//| Идея : Владимир, sibtrade@hotbox.ru |
//| Реализация: Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//| |
//| 2007.04.27 Открытие позиции в заданное время. |
//| 2008.04.10 Параметр MarketWatch. |
//| 2008.04.14 Параметр Duration. |
//+----------------------------------------------------------------------------+
#property copyright "Владимир & KimIV"
#property link "http://www.kimiv.ru"
//------- Внешние параметры советника -----------------------------------------+
extern string _P_Trade = "---------- Параметры торговли";
extern int DayOfWeekOpen = 3; // День недели открытия позиции
extern string TimeTradeOpen = "19:51"; // Время открытия позиции
extern int DayOfWeekIf = 3; // День недели условия
extern string TimeTradeIf = "19:51"; // Время условия
extern int DayOfWeekClose = 5; // День недели закрытия позиции
extern string TimeTradeClose = "19:51"; // Время закрытия позиции
extern int Duration = 300; // Продолжительность в секундах
//extern bool Sell = False; // True-Sell, False-Buy
extern double Lots = 0.1; // Размер лота
extern int StopLoss = 30; // Размер стопа в пунктах
extern int TakeProfit = 60; // Размер тейка в пунктах
extern string _P_Expert = "---------- Параметры советника";
extern int MagicNumber = 0;
extern int NumberAccount = 0; // Номер торгового счёта
extern bool UseSound = True; // Использовать звуковой сигнал
extern string NameFileSound = "expert.wav"; // Наименование звукового файла
extern bool ShowComment = True; // Показывать комментарий
extern bool MarketWatch = True; // Запросы под исполнение "Market Watch".
extern int Slippage = 3; // Проскальзывание цены
extern int NumberOfTry = 5; // Количество торговых попыток
//------- Глобальные переменные советника -------------------------------------+
bool gbDisabled = False; // Флаг блокировки советника
bool gbNoInit = False; // Флаг неудачной инициализации
color clOpenBuy = LightBlue; // Цвет значка открытия покупки
color clOpenSell = LightCoral; // Цвет значка открытия продажи
bool Sell;
//------- Подключение внешних модулей -----------------------------------------+
#include <stdlib.mqh> // Стандартная библиотека МТ4
//int deinit()
// {
//----
//----
// return(0);
// }
//+----------------------------------------------------------------------------+
//| |
//| ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ |
//| |
//+----------------------------------------------------------------------------+
//| Функция инициализации |
//+----------------------------------------------------------------------------+
void init() {
gbNoInit=False;
if (!IsTradeAllowed()) {
Message("Для нормальной работы советника необходимо\n"+
"Разрешить советнику торговать");
gbNoInit=True; return;
}
if (!IsLibrariesAllowed()) {
Message("Для нормальной работы советника необходимо\n"+
"Разрешить импорт из внешних экспертов");
gbNoInit=True; return;
}
if (!IsTesting()) {
if (IsExpertEnabled()) Message("Советник будет запущен следующим тиком");
else Message("Отжата кнопка \"Разрешить запуск советников\"");
}
}
//+----------------------------------------------------------------------------+
//| Функция деинициализации |
//+----------------------------------------------------------------------------+
void deinit() {
if (!IsTesting()) Comment("");
ObjectDelete("SLb"); //Трейлингстоп
ObjectDelete("SLs"); //Трейлингстоп
return(0);
}
//+----------------------------------------------------------------------------+
//| expert start function |
//+----------------------------------------------------------------------------+
void start() {
if (gbDisabled) {
Message("Критическая ошибка! Советник ОСТАНОВЛЕН!"); return;
}
if (gbNoInit) {
Message("Не удалось инициализировать советник!"); return;
}
if (!IsTesting()) {
if (NumberAccount>0 && NumberAccount!=AccountNumber()) {
Comment("Торговля на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!");
return;
} else Comment("");
if (ShowComment) {
string st="CurTime="+TimeToStr(TimeCurrent(), TIME_MINUTES)
+" TimeTrade="+TimeTradeOpen
+" Позиция="+GetNameOP(Sell)
+" Lots="+DoubleToStr(Lots, 1)
+" StopLoss="+DoubleToStr(StopLoss, 0)+" п."
+" TakeProfit="+DoubleToStr(TakeProfit, 0)+" п."
+IIFs(MarketWatch, " MarketWatch", "")
;
Comment(st);
} else Comment("");
}
// ================= Условие =====================================
//Sell = false;
if (DayOfWeek()==DayOfWeekIf
&& TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeIf)
&& TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeIf)+Duration)
{
if (iClose("XAUUSD",PERIOD_H1,0)-iOpen("XAUUSD",PERIOD_H1,0)>=0)
Sell = true;
if (iOpen("XAUUSD",PERIOD_H1,0)-iClose("XAUUSD",PERIOD_H1,0)>0)
Sell =false;
}
// Без условия все работает правильно. Sell тогда задаем во внешних параметрах.
// ================= Открытие позиции =====================================
if (DayOfWeek()==DayOfWeekOpen
&& TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen)
&& TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen)+Duration)
{
if (!ExistPositions("", Sell, MagicNumber)) {
double sl, tp;
if (Sell) {
if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
} else {
if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
}
OpenPosition("", Sell, Lots, sl, tp, MagicNumber);
}
}
//================= Закрытие всех ордеров в пятницу =====================================
if (DayOfWeek()==DayOfWeekClose
&& TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeClose)
&& TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeClose)+Duration)
{ if (OrdersTotal()>0)
{ for (int i=OrdersTotal()-1; i>=0; i--)
{ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderType()==OP_BUY)
{ RefreshRates();
OrderClose(OrderTicket(),OrderLots(),Bid,1000);
return(0);
}
if (OrderType()==OP_SELL)
{ RefreshRates();
OrderClose(OrderTicket(),OrderLots(),Ask,1000);
return(0);
}
}
} } }
}
//+----------------------------------------------------------------------------+
//| |
//| ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ |
//| |
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 06.03.2008 |
//| Описание : Возвращает флаг существования позиций |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//| ot - время открытия ( 0 - любое время открытия) |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=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=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (ot<=OrderOpenTime()) return(True);
}
}
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 01.09.2005 |
//| Описание : Возвращает наименование торговой операции |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| op - идентификатор торговой операции |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
switch (op) {
case OP_BUY : return("Buy");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("Buy Limit");
case OP_SELLLIMIT: return("Sell Limit");
case OP_BUYSTOP : return("Buy Stop");
case OP_SELLSTOP : return("Sell Stop");
default : return("Unknown Operation");
}
}
Подскажите такую вещь, есть на счете N советников которые при определенных условиях могут все сразу в одно время открыть ордер, стоит в каждом проверка не большего 1 ордера на счете, но в итоге иногда получаю N ордеров, что можно сделать?
Обратиться туда, там наверняка угадают причину и дистанционно внушат решение ;)
Снова здравствуйте Хочу опять поднять вопрос относительно выставления стопа на последний ордер.
Хочу уточнить что в Тестере иногда не выставляет стоп на последний ордере.
На форвард тестах пока такого не происходило. Но как говорится зачем ждать ))
код
Подскажите такую вещь, есть на счете N советников которые при определенных условиях могут все сразу в одно время открыть ордер, стоит в каждом проверка не большего 1 ордера на счете, но в итоге иногда получаю N ордеров, что можно сделать?
почитать статьи
Пауза между торговыми операциями
Ошибка 146 ("Торговый поток занят") и как с ней боротьсяпочитать статьи
Пауза между торговыми операциями
Ошибка 146 ("Торговый поток занят") и как с ней боротьсяБлагодарю!!
Уверены, что на этом участке кода собака порылась? Из того, что вы показали сложно сделать выводы - много неизвестных переменных и не видно самого открытия.
Чтобы найти причину самостоятельно, принтуйте или выводите на экран комментариями значения переменных. Тогда сможете видеть их значения в любой момент времени.
Основа - советник eOpenByTime от уважаемого мистера Кима. Мною добавлен выдранный также из чужого советника трейлинг-стоп, закрытие сделок по окончании недели и открытие сделки в определенный день недели. В данном виде советник работает как надо.
Открытие сделки происходит следующим образом, мною добавлен только день недели открытия сделки, но тут вроде накосячить негде
if (DayOfWeek()==DayOfWeekOpen && TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen) && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen)+Duration) { if (!ExistPositions("", Sell, MagicNumber)) { double sl, tp; if (Sell) { if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0; if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0; } else { if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0; if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0; } OpenPosition("", Sell, Lots, sl, tp, MagicNumber); } }Если честно, я не совсем понимаю, почему сравнивается TimeCurrent с TimeCurrent + TimeTradeOpen, где TimeTradeOpen - внешний параметр вида TimeTradeOpen = "19:51". (Это, собственно, и есть нужное нам время открытия позиции.) И почему это сравнение работает, тоже не понимаю. Duration - это время, в течение которого советник будет пытаться открыть позицию.
По абсолютной аналогии я добавил закрытие позиции в пятницу, само закрытие также вычитано на просторах интернетов.
Пока все работало.
Затем я захотел добавить условие, которое смотрит на свечку в заданное время и заданный день недели, если свечка бычья, то продаем, если медвежья - покупаем.
Аналогично скопировал вот эти 3 строчки, которые до этого работали, но сейчас почему-то не хотят.
После этого уже идет код открытия позиции. TimeTradeIf имеет аналогичный формат TimeTradeIf = "19:51" и также задается через внешние параметры.
Весь код довольно длинный, нужно вставлять?
Снова здравствуйте Хочу опять поднять вопрос относительно выставления стопа на последний ордер.
Хочу уточнить что в Тестере иногда не выставляет стоп на последний ордере.
На форвард тестах пока такого не происходило. Но как говорится зачем ждать ))
код
Нашел проблему. С кодом все гуд. это писатель требует невозможного ))
Основа - советник eOpenByTime от уважаемого мистера Кима. Мною добавлен выдранный также из чужого советника трейлинг-стоп, закрытие сделок по окончании недели и открытие сделки в определенный день недели. В данном виде советник работает как надо.
Открытие сделки происходит следующим образом, мною добавлен только день недели открытия сделки, но тут вроде накосячить негде
Если честно, я не совсем понимаю, почему сравнивается TimeCurrent с TimeCurrent + TimeTradeOpen, где TimeTradeOpen - внешний параметр вида TimeTradeOpen = "19:51". (Это, собственно, и есть нужное нам время открытия позиции.) И почему это сравнение работает, тоже не понимаю. Duration - это время, в течение которого советник будет пытаться открыть позицию.
По абсолютной аналогии я добавил закрытие позиции в пятницу, само закрытие также вычитано на просторах интернетов.
Пока все работало.
Затем я захотел добавить условие, которое смотрит на свечку в заданное время и заданный день недели, если свечка бычья, то продаем, если медвежья - покупаем.
Аналогично скопировал вот эти 3 строчки, которые до этого работали, но сейчас почему-то не хотят.
После этого уже идет код открытия позиции. TimeTradeIf имеет аналогичный формат TimeTradeIf = "19:51" и также задается через внешние параметры.
Весь код довольно длинный, нужно вставлять?
Честно говоря, я уже и забыл в чём там у вас проблема. Вот в этом участке кода вижу, что проверяется только наличие коротких позиций и открытие тоже только коротких позиций прописано:
Честно говоря, я уже и забыл в чём там у вас проблема. Вот в этом участке кода вижу, что проверяется только наличие коротких позиций и открытие тоже только коротких позиций прописано:
Артем, все зесь верно, переменная Sell внешняя, и несет в себе значение true или false, 1 или 0 соответственно,
у Кима глянул, eOpenByTime.
Хромает логика, алгаритм действий.
Если он скинул бы функцию start() и переменные, что они в себе несут, тогда можно что-то подсказать.
Артем, все зесь верно, переменная Sell внешняя, и несет в себе значение true или false, 1 или 0 соответственно,
у Кима глянул, eOpenByTime.
Хромает логика, алгаритм действий.
Если он скинул бы функцию start() и переменные, что они в себе несут, тогда можно что-то подсказать.
Суть такая: если в определенный день DayOfWeekIf в определенное время TimeTradeIf свеча бычья, то Sell = true (продаем), если медвежья, то Sell = false (покупаем).
Так должно быть, но на тесте получаю сделки только на продажу.
eOpenByTime позволяет открывать сделку в заданное время, я добавил еще в заданный день недели if (DayOfWeek()==DayOfWeekOpen, где DayOfWeekOpen = 1,2,3,4,5
Прикрепляю код двумя частями, по-другому не влезает, проблемное условие выделил. Без него все работает как надо, то есть Sell задаем внешне и в нужный день недели в нужное время открывается сделка в нужном направлении.
Вырезал только трал.