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 ;)
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?
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.
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);
}
}
} } }
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.
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;
}
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?
É 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:
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
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,
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");
}
}
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
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"); } }