Приветствую! Подскажите, пожалуйста, как лучше прописать запрет на одновременное открытие более установленного значения числа серий по разным инструментам (бот прикреплен одновременно к нескольким графикам различных инструментов) на бинарных опционах?
extern double Lots = 1; // Лот
extern int Exp = 1; // Експирация
extern int Wait = 0; // Количество свечей одного направления
extern int Timeout = 1; // Промежуток времени
extern double Multiplier = 3; // Множитель
extern int Slippage = 5; // Проскальзывание
extern int MaxOpenOrders = 1; // Максимальное количество одновременно открытых ордеров
Приветствую! Подскажите, пожалуйста, как лучше прописать запрет на одновременное открытие более установленного значения числа серий по разным инструментам (бот прикреплен одновременно к нескольким графикам различных инструментов) на бинарных опционах?
extern double Lots = 1; // Лот
extern int Exp = 1; // Експирация
extern int Wait = 0; // Количество свечей одного направления
extern int Timeout = 1; // Промежуток времени
extern double Multiplier = 3; // Множитель
extern int Slippage = 5; // Проскальзывание
extern int MaxOpenOrders = 1; // Максимальное количество одновременно открытых ордеров
Скажите пожалуйста, а с какой целью Вы используете MagicNumber, что он дает в этой стратегии? ИМХО, здесь также можно выбросить функции OnInit OnDeinit
LRA: Скажите пожалуйста, а с какой целью Вы используете MagicNumber, что он дает в этой стратегии? ИМХО, здесь также можно выбросить функции OnInit OnDeinit
С какой целью выделены слова "в этой стратегии"? Magic нужен, если на счете заключаются сделки вручную или еще другой советник запущен, чтобы эти ордер не трогать. По-моему так.
Ты советник вручную на графики цепляешь и тебе надо, чтобы на КАЖДОМ из графиков он открывал MaxOpenOrders ордеров или ВСЕГО MaxOpenOrders ордеров? И каких ордеров: только рыночных или всех, включая limit и stop?
Ты советник вручную на графики цепляешь и тебе надо, чтобы на КАЖДОМ из графиков он открывал MaxOpenOrders ордеров или ВСЕГО MaxOpenOrders ордеров? И каких ордеров: только рыночных или всех, включая limit и stop?
Нужно чтоб открывал всего для всех инструментов. Допустим MaxOpenOrders равен 1 должен открывать только один рыночный ордер. Это бот для бинарных опционов, там нет никаких отложенных ордеров. Правда, он работает сериями, если позиция закрывается в убытке, то открывается такая же только с увеличенным лотом и пока серия не закончится прибыльной сделкой не должны открываться никакие сделки по другим инструментам.
Приветствую! Подскажите, пожалуйста, как лучше прописать запрет на одновременное открытие более установленного значения числа серий по разным инструментам (бот прикреплен одновременно к нескольким графикам различных инструментов) на бинарных опционах?
extern double Lots = 1; // Лот
extern int Exp = 1; // Експирация
extern int Wait = 0; // Количество свечей одного направления
extern int Timeout = 1; // Промежуток времени
extern double Multiplier = 3; // Множитель
extern int Slippage = 5; // Проскальзывание
extern int MaxOpenOrders = 1; // Максимальное количество одновременно открытых ордеров
extern int Magic = 774274; // Магик
int ticket, Type;
double Price, Lot;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// --------------- Открытие сделок ---------------
if (CountTrades() == 0) // Количество ордеров должно равняться нулю
{
if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
// Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
{
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
// Если прибыль последней сделки равняется нулю, то открывается такая же
{
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder(), 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
|| CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер
{
if (SignalBuy() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (SignalSell() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
}
}
}
//+------------------------------------------------------------------+
int CountTrades(int type = -1)
{
int cnt = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
cnt++;
}
}
return(cnt);
}
//+------------------------------------------------------------------+
int CountHistTrades(int type = -1)
{
int cnt = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
cnt++;
}
}
return(cnt);
}
//+------------------------------------------------------------------+
bool SignalBuy()
{
for (int i=1; i<=Wait; i++)
{
if (Close[i] > Open[i]) return(false);
}
if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true);
if (CountHistTrades() == 0) return(true);
return(false);
}
//+------------------------------------------------------------------+
bool SignalSell()
{
for (int i=1; i<=Wait; i++)
{
if (Close[i] < Open[i]) return(false);
}
if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true);
if (CountHistTrades() == 0) return(true);
return(false);
}
//+------------------------------------------------------------------+
datetime TimeLastHistOrder(int type = -1)
{
datetime lasttime = 0;
datetime opentime = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > lasttime)
{
lasttime = OrderCloseTime();
opentime = OrderOpenTime();
}
}
}
}
return(opentime);
}
//+------------------------------------------------------------------+
int TypeLastHistOrder()
{
datetime time = 0;
int type = -1;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
type = OrderType();
}
}
}
}
return(type);
}
//+------------------------------------------------------------------+
double LotsLastHistOrder(int type = -1)
{
datetime time = 0;
double lots = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderOpenTime() > time)
{
time = OrderOpenTime();
lots = OrderLots();
}
}
}
}
return(lots);
}
//+------------------------------------------------------------------+
double PriceCloseLastHistOrder(int type = -1)
{
datetime time = 0;
double price = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
price = OrderClosePrice();
}
}
}
}
return(price);
}
//+------------------------------------------------------------------+
double PriceOpenLastHistOrder(int type = -1)
{
datetime time = 0;
double price = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
price = OrderOpenPrice();
}
}
}
}
return(price);
}
//+------------------------------------------------------------------+
Просто исключить из функции CountTrades условие OrderSymbol() == Symbol() и добавить OrderType() == OP_BUY || OrderType() == OP_SELL, разве нет?
И в OnTick перед OrderSend изменить условие if (SignalBuy() && CountTrades() < MaxOpenOrders)... И на продажу аналогично.if (OrderMagicNumber() == Magic && (OrderType() == OrderType() == OP_BUY || OrderType() == OP_SELL))
Я правильно изменил?
Приветствую! Подскажите, пожалуйста, как лучше прописать запрет на одновременное открытие более установленного значения числа серий по разным инструментам (бот прикреплен одновременно к нескольким графикам различных инструментов) на бинарных опционах?
extern double Lots = 1; // Лот
extern int Exp = 1; // Експирация
extern int Wait = 0; // Количество свечей одного направления
extern int Timeout = 1; // Промежуток времени
extern double Multiplier = 3; // Множитель
extern int Slippage = 5; // Проскальзывание
extern int MaxOpenOrders = 1; // Максимальное количество одновременно открытых ордеров
extern int Magic = 774274; // Магик
int ticket, Type;
double Price, Lot;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// --------------- Открытие сделок ---------------
if (CountTrades() == 0) // Количество ордеров должно равняться нулю
{
if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
// Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
{
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
// Если прибыль последней сделки равняется нулю, то открывается такая же
{
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder(), 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
|| CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер
{
if (SignalBuy() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (SignalSell() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
}
}
}
//+------------------------------------------------------------------+
int CountTrades(int type = -1)
{
int cnt = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
cnt++;
}
}
return(cnt);
}
//+------------------------------------------------------------------+
int CountHistTrades(int type = -1)
{
int cnt = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
cnt++;
}
}
return(cnt);
}
//+------------------------------------------------------------------+
bool SignalBuy()
{
for (int i=1; i<=Wait; i++)
{
if (Close[i] > Open[i]) return(false);
}
if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true);
if (CountHistTrades() == 0) return(true);
return(false);
}
//+------------------------------------------------------------------+
bool SignalSell()
{
for (int i=1; i<=Wait; i++)
{
if (Close[i] < Open[i]) return(false);
}
if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true);
if (CountHistTrades() == 0) return(true);
return(false);
}
//+------------------------------------------------------------------+
datetime TimeLastHistOrder(int type = -1)
{
datetime lasttime = 0;
datetime opentime = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > lasttime)
{
lasttime = OrderCloseTime();
opentime = OrderOpenTime();
}
}
}
}
return(opentime);
}
//+------------------------------------------------------------------+
int TypeLastHistOrder()
{
datetime time = 0;
int type = -1;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
type = OrderType();
}
}
}
}
return(type);
}
//+------------------------------------------------------------------+
double LotsLastHistOrder(int type = -1)
{
datetime time = 0;
double lots = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderOpenTime() > time)
{
time = OrderOpenTime();
lots = OrderLots();
}
}
}
}
return(lots);
}
//+------------------------------------------------------------------+
double PriceCloseLastHistOrder(int type = -1)
{
datetime time = 0;
double price = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
price = OrderClosePrice();
}
}
}
}
return(price);
}
//+------------------------------------------------------------------+
double PriceOpenLastHistOrder(int type = -1)
{
datetime time = 0;
double price = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
price = OrderOpenPrice();
}
}
}
}
return(price);
}
//+------------------------------------------------------------------+
Время можно задавать сразу в формате datetime, не надо машинное время терять на преобразование, вот так работает:
extern datetime StartTime = D'07:00';
В таком формате времени при запуске советника получаем дату компиляции советника, а хотелось бы сегодняшнюю.
Как исправить?
В таком формате времени при запуске советника получаем дату компиляции советника, а хотелось бы сегодняшнюю.
Как исправить?
При запуске меняете параметр на желаемый, точно так же, как и остальные пользовательские параметры.
И мне почему-то показывает текущую дату на момент запуска скрипта.
Скажите пожалуйста, а с какой целью Вы используете MagicNumber, что он дает в этой стратегии? ИМХО, здесь также можно выбросить функции OnInit OnDeinit
Ты советник вручную на графики цепляешь и тебе надо, чтобы на КАЖДОМ из графиков он открывал MaxOpenOrders ордеров или ВСЕГО MaxOpenOrders ордеров? И каких ордеров: только рыночных или всех, включая limit и stop?
Ты советник вручную на графики цепляешь и тебе надо, чтобы на КАЖДОМ из графиков он открывал MaxOpenOrders ордеров или ВСЕГО MaxOpenOrders ордеров? И каких ордеров: только рыночных или всех, включая limit и stop?