Как кодировать? - страница 344

 
mladen:

tkuan77

Вам нужно найти последний закрытый бар и посмотреть, совпадает ли день последнего закрытого бара с текущим днем.

Вы можете использовать что-то вроде этой функции, чтобы получить время последнего закрытого ордера:

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

А затем вы можете проверить, совпадает ли дата.

Привет, Младен,

Но куда мне вставить эту часть кода? Извините за вопрос, так как я еще совсем новичок в кодировании и до сих пор не могу понять, как работает цикл For.

С уважением,

Райан

 
tkuan77:

Привет, Младен,

Но куда мне вставить эту часть кода? Извините за вопрос, так как я еще совсем новичок в кодировании и до сих пор не могу понять, как работает цикл For.

С уважением,

Райан

Райан

Что-то вроде этого :

if (TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime())) // торговли нет

 
mladen:

Райан

Что-то вроде этого :

if (TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime())) // нет торговли

Привет, Младен, я добавил код, но он, похоже, выдает какую-то ошибку глобальной переменной. Также я заметил, что у вас есть переменная MagicNumber, которая не определена, могу я спросить, для чего она нужна? Я добавил ее в раздел int, но не уверен, для чего она нужна.

Дайте совет. Еще раз спасибо за ваше терпение.

//---- входные параметры

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

//+------------------------------------------------------------------+

//| функция инициализации эксперта |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| функция деинициализации эксперта | |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| функция запуска эксперта |

//+------------------------------------------------------------------+

int start()

{

//+------------------------------------------------------------------+

//-- Триггерная торговля

//+------------------------------------------------------------------+

int ticket, total, MagicNumber;

double TP_Value, SL_Value;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

total = OrdersTotal(); // проверка общего количества сделок, открытых в настоящее время

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())))

{

if ((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

if ((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]);

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

if ((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]);

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())))

{

if ((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

if ((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

if ((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

return(0);

}

//+------------------------------------------------------------------+

 
tkuan77:

Привет mladen, я добавил код, но он, похоже, выдает какую-то ошибку глобальной переменной. Также я заметил, что у вас есть переменная MagicNumber, которая не определена, могу я спросить, для чего она нужна? Я добавил ее в раздел int, но не уверен, для чего она нужна.

Дайте совет. Еще раз спасибо за ваше терпение.

//---- входные параметры

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

//+------------------------------------------------------------------+

//| функция инициализации эксперта |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| функция деинициализации эксперта | |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| функция запуска эксперта |

//+------------------------------------------------------------------+

int start()

{

//+------------------------------------------------------------------+

//-- Триггерная торговля

//+------------------------------------------------------------------+

int ticket, total, MagicNumber;

double TP_Value, SL_Value;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

total = OrdersTotal(); // проверка общего количества сделок, открытых в настоящее время

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())))

{

if ((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

if ((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]);

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

if ((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]);

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())))

{

if ((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

if ((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

if ((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

return(0);

}

//+------------------------------------------------------------------+

Это функция

Переместите ее за пределы тела функции start()

 

mladen:

Это функция

Переместите его за пределы тела функции start()

Привет mladen, я попробовал переместить функцию из Start function, однако, мой советник все еще запускает более 1 сделки в день вместо того, чтобы ограничиться только 1 сделкой в день.

Спасибо за просвещение.

С уважением,

//---- входные параметры

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

//+------------------------------------------------------------------+

//| функция инициализации эксперта |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| функция деинициализации эксперта | |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| функция запуска эксперта |

//+------------------------------------------------------------------+

int MagicNumber;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

int start()

{

//+------------------------------------------------------------------+

//-- Триггерная торговля

//+------------------------------------------------------------------+

int ticket, total;

double TP_Value, SL_Value;

total = OrdersTotal(); // проверяем общее количество сделок, открытых в данный момент

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())))

{

if ((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // значение длинного тела

SL_Value = (Low[1] - 0.0010); // всегда одинаково для лонга

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

if ((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // значение короткого тела

SL_Value = (Low[1] - 0.0010); // всегда одинаково для лонга

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

if ((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // значение всей свечи, включая голову и хвост

SL_Value = (Low[1] - 0.0010); // всегда одно и то же для лонга

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())))

{

if ((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // значение длинного тела

SL_Value = (High[1] + 0.0010); // всегда одинаково для шорта

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

if ((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // значение короткого тела

SL_Value = (High[1] + 0.0010); // всегда одинаково для шорта

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

if ((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // значение всей свечи, включая голову и хвост

SL_Value = (High[1] + 0.0010); // всегда одинаково для шорта

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

return(0);

}

//+------------------------------------------------------------------+

 
tkuan77:

Привет, mladen, я попробовал переместить функцию из функции Start, однако мой советник по-прежнему запускает более 1 сделки в день вместо того, чтобы ограничиться только 1 сделкой в день.

Спасибо за просвещение.

С уважением,

//---- входные параметры

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

//+------------------------------------------------------------------+

//| функция инициализации эксперта |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| функция деинициализации эксперта | |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| функция запуска эксперта |

//+------------------------------------------------------------------+

int MagicNumber;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

int start()

{

//+------------------------------------------------------------------+

//-- Триггерная торговля

//+------------------------------------------------------------------+

int ticket, total;

double TP_Value, SL_Value;

total = OrdersTotal(); // проверяем общее количество сделок, открытых в данный момент

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())))

{

if ((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // значение длинного тела

SL_Value = (Low[1] - 0.0010); // всегда одинаково для лонга

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

if ((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // значение короткого тела

SL_Value = (Low[1] - 0.0010); // всегда одинаково для лонга

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

if ((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // значение всей свечи, включая голову и хвост

SL_Value = (Low[1] - 0.0010); // всегда одно и то же для лонга

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())))

{

if ((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // значение длинного тела

SL_Value = (High[1] + 0.0010); // всегда одинаково для шорта

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

if ((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // значение короткого тела

SL_Value = (High[1] + 0.0010); // всегда одинаково для шорта

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

if ((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // значение всей свечи, включая голову и хвост

SL_Value = (High[1] + 0.0010); // всегда одинаково для шорта

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

return(0);

}

//+------------------------------------------------------------------+

tkuan77

Замените это :

if(total < 1)

этим :

if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent())) ;

И больше не должно этого делать

 
mladen:

tkuan77

Замените это :

if(total < 1)

этим :

if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent())) ;

И она больше не должна этого делать

Привет, mladen, после того, как я ввел код, вместо того, чтобы срабатывать на 1 сделку в день, он срабатывает на несколько сделок сразу, пока счет не лопнет. Может ли это быть вызвано каким-то механизмом срабатывания?

С уважением,

 

Привет, mladen, у меня есть код, который закрывает все отложенные сделки, которые у меня есть, после того, как я запустил сделку. как я могу установить, чтобы отменить только текущую существующую отложенную сделку после того, как я запустил сделку, а не все будущие отложенные сделки?

спасибо.....

int new_del()

{

int i,a;

int total = OrdersTotal();

string comentario, par;

for (i=total-1; i >=0; i--)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY || OrderType()==OP_SELL)

{

for (a=total-1; a >=0; a--)

{

OrderSelect(a,SELECT_BY_POS,MODE_TRADES);

comentario=OrderComment();

par=StringSubstr(comentario,0,6);

if(OrderType()==OP_SELLSTOP)// && comentario==Symbol())

{

OrderDelete(OrderTicket());

Print("Удаление SELL_STOP", "Orderertype:",OrderType());

return(1);

}

if(OrderType()==OP_BUYSTOP)// && par==Symbol())

{

OrderDelete(OrderTicket());

Print("Удаление BUY_STOP", "Orderertype:",OrderType());

return(1);

}

}

}

}

}

 
tkuan77:
Привет, Младен, у меня есть код, который закрывает все отложенные сделки, которые у меня есть, после того как я запустил сделку. как мне установить, чтобы отменить только текущую существующую отложенную сделку после того, как я запустил сделку, а не все будущие отложенные сделки?

спасибо.....

int new_del()

{

int i,a;

int total = OrdersTotal();

string comentario, par;

for (i=total-1; i >=0; i--)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY || OrderType()==OP_SELL)

{

for (a=total-1; a >=0; a--)

{

OrderSelect(a,SELECT_BY_POS,MODE_TRADES);

comentario=OrderComment();

par=StringSubstr(comentario,0,6);

if(OrderType()==OP_SELLSTOP)// && comentario==Symbol())

{

OrderDelete(OrderTicket());

Print("Удаление SELL_STOP", "Orderertype:",OrderType());

return(1);

}

if(OrderType()==OP_BUYSTOP)// && par==Symbol())

{

OrderDelete(OrderTicket());

Print("Удаление BUY_STOP", "Orderertype:",OrderType());

return(1);

}

}

}

}

}

tkuan77

Что означает "текущая отложенная сделка" и что означает "будущая отложенная сделка"?

 
mladen:

tkuan77

Что означает "текущая отложенная сделка" и что означает "будущая отложенная сделка"?

Привет Младен,

Текущая отложенная сделка означает: как только условие будет выполнено, ea установит 2 отложенные сделки (1 длинную и 1 короткую). Таким образом, если, скажем, сработает длинная сделка, ea автоматически отменит короткую отложенную сделку.

Будущая отложенная сделка означает: после того, как ea отменит предыдущие отложенные сделки и, скажем, условие будет выполнено снова, ea по праву должна установить еще 2 отложенные сделки (1 длинную и 1 короткую). однако, если ea в настоящее время имеет текущую сделку, ea автоматически отменит все отложенные ордера, которые ea пытается установить.

Я пытаюсь сделать так, чтобы система отменяла только текущую отложенную сделку после того, как сделка была запущена.

с уважением,