Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 238
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Me pueden sugerir lo siguiente, hay N EAs en la cuenta, que bajo ciertas condiciones pueden abrir todos una orden al mismo tiempo, cada uno de ellos verifica no más de 1 orden en la cuenta, pero a veces termino con N órdenes, ¿qué puedo hacer?
Póngase en contacto con ellos, probablemente adivinarán el motivo y le sugerirán remotamente una solución ;)
Hola de nuevo me gustaría plantear una duda sobre la colocación de un stop en la última orden.
Quiero aclarar que en el probador a veces no se coloca un stop en la última orden.
Esto no ha ocurrido hasta ahora en las pruebas de avance. Pero como se dice, ¿para qué esperar?)
Código
Me pueden sugerir lo siguiente, hay N EAs en la cuenta, que bajo ciertas condiciones pueden abrir todos una orden al mismo tiempo, cada uno de ellos verifica no más de 1 orden en la cuenta, pero a veces termino con N órdenes, ¿qué puedo hacer?
leer artículos
Pausa entre operaciones
Error 146 ("Flujo comercial ocupado") y cómo solucionarloleer artículos
Pausa entre operaciones
Error 146 ("Flujo comercial ocupado") y cómo solucionarlo¡¡¡Gracias!!!
¿Está seguro de que esta parte del código es el origen del problema? A partir de lo que has mostrado es difícil sacar conclusiones: hay muchas variables desconocidas y no se puede ver la apertura en sí.
Para encontrar la razón usted mismo, imprima o muestre los valores de las variables con comentarios. Así podrás ver sus valores en cualquier momento.
Esto se basa en eOpenByTime Expert Advisor del Sr. Kim. También añadí un trailing stop, cerré al final de la semana y abrí en un día determinado de la semana. En esta forma el Asesor Experto funciona como debe ser.
La apertura del acuerdo se realiza de la siguiente manera, he añadido sólo el día de una semana de apertura del acuerdo pero no hay nada que fastidiar aquí
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); } }Para ser honesto, no entiendo muy bien por qué TimeCurrent se compara con TimeCurrent + TimeTradeOpen donde TimeTradeOpen es un parámetro externo del tipo TimeTradeOpen = "19:51". (Tampoco entiendo por qué funciona esta comparación. La duración es el tiempo durante el cual el Asesor Experto intentará abrir una posición.
Por analogía, he añadido un cierre de una posición el viernes.
Hasta ahora, todo estaba funcionando.
Entonces quería añadir una condición que mirara una vela a una hora determinada y un día determinado de la semana, si la vela es alcista, entonces vender, si es bajista, entonces comprar.
De la misma manera, he copiado estas 3 líneas, que han funcionado antes, pero ahora por alguna razón no quieren hacerlo.
A continuación, el código para la apertura de la posición. TimeTradeIf tiene un formato similar TimeTradeIf = "19:51" y también se establece mediante parámetros externos.
Todo el código es bastante largo, ¿es necesario insertarlo?
Hola de nuevo me gustaría plantear una duda sobre la colocación de un stop en la última orden.
Quiero aclarar que en el probador a veces no se coloca un stop en la última orden.
Esto no ha ocurrido hasta ahora en las pruebas de avance. Pero como se dice, ¿para qué esperar?)
Código
Encontré el problema. El código está bien. es el escritor quien exige lo imposible ))
Se basa en el eOpenByTime Expert Advisor del estimado Sr. Kim. También añadí un trailing stop, cerré al final de la semana y abrí en un día determinado de la semana. En esta forma el EA funciona como debería.
La apertura del acuerdo se realiza de la siguiente manera, he añadido sólo el día de la semana de apertura del acuerdo pero no hay nada que fastidiar aquí
Para ser sincero, no entiendo muy bien por qué TimeCurrent se compara con TimeCurrent + TimeTradeOpen, donde TimeTradeOpen es un parámetro externo del tipo TimeTradeOpen = "19:51". (En realidad, es el tiempo de apertura de la posición que necesitamos.) Tampoco entiendo por qué funciona esta comparación. La duración es el tiempo durante el cual el Asesor Experto intentará abrir una posición.
Por analogía, he añadido un cierre de una posición el viernes.
Hasta ahora, todo estaba funcionando.
Entonces quería añadir una condición que mirara una vela a una hora determinada y un día determinado de la semana, si la vela es alcista, entonces vender, si es bajista, entonces comprar.
De la misma manera, he copiado estas 3 líneas, que han funcionado antes, pero ahora por alguna razón no quieren hacerlo.
A continuación, el código para la apertura de la posición. TimeTradeIf tiene un formato similar TimeTradeIf = "19:51" y también se establece mediante parámetros externos.
El código completo es bastante largo, ¿debo pegarlo?
Para ser sincero, ya he olvidado cuál es el problema. En esta sección de código veo que sólo se comprueban las posiciones cortas y también se especifica la apertura de posiciones cortas:
Para ser sincero, he olvidado cuál es el problema. En esta sección de código veo que sólo se comprueban las posiciones cortas y sólo se abren las posiciones cortas:
La variable Sell es externa y contiene verdadero o falso, 1 o 0, respectivamente,
El de Kim es eOpenByTime.
La lógica, el algoritmo de las acciones, es defectuoso.
Si dejara la función start() y las variables, lo que llevan, entonces podemos sugerir algo.
Artem, esto es correcto, la variable Sell es externa y lleva el valor verdadero o falso, 1 o 0 respectivamente,
He mirado el de Kim, eOpenByTime.
La lógica, el algoritmo de las acciones, es defectuoso.
Si mostrara la función start() y las variables, lo que llevan, entonces podemos sugerir algo.
La idea es la siguiente: si una vela es alcista en un determinado DayOfWeekIf en un determinado TimeTradeIf, entonces Sell = true (vender), si es bajista, entonces Sell = false (comprar).
Debería serlo, pero en la prueba sólo consigo intercambios en rebajas.
eOpenByTime permite abrir el trato a una hora determinada, yo añadí más a un día determinado de la semana if (DayOfWeek()==DayOfWeekOpen, donde DayOfWeekOpen = 1,2,3,4,5
Adjunto el código en dos partes, no hay más remedio, he resaltado la condición del problema. Todo funciona como debería sin él, es decir, fijamos la venta y abrimos una operación a la hora correcta en el día correcto de la semana.
Sólo se ha recortado el arrastre.
//+----------------------------------------------------------------------------+ //| 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"); } }