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
你能建议以下事情吗,账户上有N个EA,在一定条件下都可以同时开出一个订单,每个人在账户上检查的订单不超过1个,但有时我最终会有N个订单,我该怎么做?
联系他们,他们可能会猜到原因,并远程提出解决方案;)
你好,我想再次提出一个关于在最后一笔订单上设置止损的问题。
我想澄清的是,在测试器中,有时止损没有放在最后一个订单上。
到目前为止,这种情况还没有发生在前方的测试中。 但正如他们所说,为什么要等待?)
编码
你能建议以下事情吗,账户上有N个EA,在一定条件下都可以同时开出一个订单,每个人在账户上检查的订单不超过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 "类型的外部参数。(这实际上是我们需要的职位空缺时间。)我也不明白为什么这种比较会奏效。持续时间是指专家顾问将尝试开仓的时间。
以此类推,我在周五增加了一个平仓的机会。
到目前为止,一切都在运作。
然后,我想添加一个条件,在一个特定的时间和一个特定的日子看一个蜡烛图,如果蜡烛图是看涨的,就卖出,如果是看跌的,就买入。
以同样的方式,我复制了这3行字,它们以前一直在工作,但现在由于某些原因,它们不愿意了。
此后,开仓的代码如下。TimeTradeIf也有类似的格式 TimeTradeIf = "19:51",也是通过外部参数设置。
整个代码相当长,你需要插入吗?
你好,我想再次提出一个关于在最后一笔订单上设置止损的问题。
我想澄清的是,在测试器中,有时止损没有放在最后一个订单上。
到目前为止,这种情况还没有发生在前方的测试中。 但正如他们所说,为什么要等待?)
编码
找到了问题所在。代码是可以的。是作者要求不可能的事 ))
它是基于尊敬的金先生的eOpenByTime专家顾问。我还添加了一个追踪止损,在周末关闭,在一周的某一天打开。在这种形式下,EA的工作是应该的。
交易开盘是按以下方式进行的,只有交易开盘的那一周的日期是由我加上去的,但这里没有什么可搞砸的。
说实话,我不太明白为什么TimeCurrent与TimeCurrent+TimeTradeOpen相比,其中TimeTradeOpen是TimeTradeOpen="19:51 "类型的外部参数。(这实际上是我们需要的职位空缺时间。)我也不明白为什么这种比较会奏效。持续时间是指专家顾问将尝试开仓的时间。
以此类推,我在周五增加了一个平仓的机会。
到目前为止,一切都在运作。
然后,我想添加一个条件,在一个特定的时间和一个特定的日子看一个蜡烛图,如果蜡烛图是看涨的,就卖出,如果是看跌的,就买入。
以同样的方式,我复制了这3行字,它们以前一直在工作,但现在由于某些原因,它们不愿意了。
此后,开仓的代码如下。TimeTradeIf也有类似的格式 TimeTradeIf = "19:51",也是通过外部参数设置。
整个代码相当长,我应该粘贴它吗?
说实话,我已经忘记了问题是什么。在这段代码中,我看到只有空头头寸被检查,而且还规定了空头头寸的开仓。
说实话,我已经忘记了问题出在哪里。在这个代码部分,我看到只有空头头寸被检查,只有空头头寸被打开。
Sell变量是外部的,分别包含真或假,1或0。
金的是eOpenByTime。
逻辑,行动的算法,是有缺陷的。
如果他能放弃start()函数和变量,它们所承载的内容,那么我们可以提出一些建议。
Artem,这是正确的,Sell变量是外部的,并且分别带有真或假、1或0的值。
我看了金的,eOpenByTime。
逻辑,行动的算法,是有缺陷的。
如果他能展示start()函数和变量,它们所承载的内容,那么我们就能提出一些建议。
这个想法是这样的:如果一个蜡烛在某个DayOfWeekIf在某个TimeTradeIf的时间是看涨的,那么Sell = true(卖出),如果是看跌的,那么Sell = false(买入)。
应该是这样的,但在测试中,我只在出售时得到交易。
eOpenByTime允许在给定的时间打开交易,我在给定的工作日增加了 if (DayOfWeek()==DayOfWeekOpen, where DayOfWeekOpen = 1,2,3,4,5
我把代码分成两部分附上,没有别的办法,我已经把问题的条件强调了。没有它,一切都按部就班地进行,也就是说,我们设置了塞尔,并在一周中的正确时间打开交易。
只有拖网已被切断。
//+----------------------------------------------------------------------------+ //| 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"); } }