Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 238
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Você pode sugerir o seguinte, existem N EAs na conta, que sob certas condições podem todos abrir uma ordem ao mesmo tempo, cada um deles verifica não mais de 1 ordem na conta, mas às vezes eu acabo com N ordens, o que posso fazer?
Contate-os, eles provavelmente adivinharão a razão e remotamente sugerirão uma solução ;)
Olá novamente, gostaria de levantar uma questão sobre colocar uma parada no último pedido.
Quero esclarecer que no testador às vezes não é colocada uma parada no último pedido.
Isto não aconteceu até agora nos testes de avanço. Mas como se costuma dizer, por que esperar?)
Código
Você pode sugerir o seguinte, existem N EAs na conta, que sob certas condições podem todos abrir uma ordem ao mesmo tempo, cada um deles verifica não mais de 1 ordem na conta, mas às vezes eu acabo com N ordens, o que posso fazer?
ler artigos
Pausa entre comércios
Erro 146 ("Fluxo comercial ocupado") e como lidar com eleler artigos
Pausa entre comércios
Erro 146 ("Fluxo comercial ocupado") e como lidar com eleObrigado!!!
Você tem certeza de que esta parte do código é a fonte do problema? Do que você mostrou é difícil tirar conclusões - há muitas variáveis desconhecidas e você não consegue ver a abertura em si.
Para encontrar o motivo, imprima ou exiba os valores das variáveis com comentários. Então, você poderá ver seus valores a qualquer momento.
Isto é baseado no eOpenByTime Expert Advisor do Sr. Kim. Eu também acrescentei uma parada de trilha, fechada no final da semana e aberta em um determinado dia da semana. Nesta forma, o Expert Advisor trabalha como deve ser.
A abertura do negócio é feita da seguinte forma, acrescentei apenas o dia da semana de abertura do negócio, mas não há nada para estragar aqui
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, não entendo bem porque o TimeCurrent é comparado ao TimeCurrent + TimeTradeOpen onde TimeTradeOpen é um parâmetro externo do tipo TimeTradeOpen = "19:51". (Este é na verdade o tempo de abertura de posição que precisamos). Também não entendo porque esta comparação funciona. Duração é o tempo durante o qual o Expert Advisor tentará abrir uma posição.
Por analogia, acrescentei um fechamento de uma posição na sexta-feira.
Até agora, tudo estava funcionando.
Depois quis acrescentar uma condição que olha para um castiçal em uma determinada hora e em um determinado dia da semana, se o castiçal estiver em alta, então vender, se estiver em baixa, então comprar.
Da mesma forma, copiei estas 3 linhas, que já funcionaram antes, mas agora por alguma razão eles não querem fazê-lo.
Depois disso, segue o código de abertura de posição. TimeTradeIf tem um formato similar TimeTradeIf = "19:51" e também é definido através de parâmetros externos.
O código inteiro é bastante longo, você precisa inserir?
Olá novamente, gostaria de levantar uma questão sobre colocar uma parada no último pedido.
Quero esclarecer que no testador às vezes não é colocada uma parada no último pedido.
Isto não aconteceu até agora nos testes de avanço. Mas como se costuma dizer, por que esperar?)
Código
Encontrei o problema. O código é OK. é o escritor que exige o impossível ))
É baseado no eOpenByTime Expert Advisor do estimado Sr. Kim. Eu também acrescentei uma parada de trilha, fechada no final da semana e aberta em um determinado dia da semana. Nesta forma, a EA funciona como deveria.
A abertura do negócio é feita da seguinte forma, acrescentei apenas o dia da semana de abertura do negócio, mas não há nada para estragar aqui
Para ser honesto, eu não entendo bem porque TimeCurrent é comparado com TimeCurrent + TimeTradeOpen, onde TimeTradeOpen é um parâmetro externo do tipo TimeTradeOpen = "19:51". (Este é na verdade o tempo de abertura de posição que precisamos). Também não entendo porque esta comparação funciona. Duração é o tempo durante o qual o Expert Advisor tentará abrir uma posição.
Por analogia, acrescentei um fechamento de uma posição na sexta-feira.
Até agora, tudo estava funcionando.
Depois quis acrescentar uma condição que olha para um castiçal em uma determinada hora e em um determinado dia da semana, se o castiçal estiver em alta, então vender, se estiver em baixa, então comprar.
Da mesma forma, copiei estas 3 linhas, que já funcionaram antes, mas agora por alguma razão eles não querem fazê-lo.
Depois disso, segue o código de abertura de posição. TimeTradeIf tem um formato similar TimeTradeIf = "19:51" e também é definido através de parâmetros externos.
O código inteiro é bastante longo, devo colá-lo?
Para ser honesto, eu já esqueci qual é o problema. Nesta seção de código vejo que apenas as posições curtas são verificadas e a abertura das posições curtas também é especificada:
Para ser honesto, eu esqueci qual é o problema. Nesta seção de código vejo que apenas posições curtas são verificadas e apenas posições curtas são abertas:
A variável Vender é externa e contém verdadeiro ou falso, 1 ou 0, respectivamente,
Kim's é eOpenByTime.
A lógica, o algoritmo das ações, é falho.
Se ele desistir da função start() e das variáveis, o que elas carregam, então podemos sugerir algo.
Artem, isto é correto, a variável Venda é externa e carrega o valor verdadeiro ou falso, 1 ou 0 respectivamente,
Eu olhei o Kim's, eOpenByTime.
A lógica, o algoritmo das ações, é falho.
Se ele mostrar a função e as variáveis de partida(), o que elas carregam, então podemos sugerir algo.
A idéia é a seguinte: se uma vela está em alta em um determinado DayOfWeekSe em um determinado horário TimeTradeIf, então Sell = true (vender), se está em baixa, então Sell = false (comprar).
Deveria ser, mas no teste eu só recebo negócios à venda.
eOpenByTime permite abrir negócio em determinado horário, eu adicionei mais em determinado dia da semana if (DayOfWeek()==DayOfWeekOpen, onde DayOfWeekOpen = 1,2,3,4,5
Estou anexando o código em duas partes, não há outra forma de contornar o problema, eu sublinhei a condição do problema. Tudo funciona como deveria sem ele, ou seja, nós estabelecemos a venda e abrimos um negócio na hora certa, no dia certo da semana.
Somente a rede de arrasto foi cortada.
//+----------------------------------------------------------------------------+ //| 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"); } }