Добрый день. помогите решить проблему. на свече М15 открывается несколько сделок подряд.
Нужно, чтобы открывалось не более одной сделки. Логика советника так устроена, что пока не закроется предыдущий ордер, следующий - не откроется, но иногда на такой длинной свече открывается серия сделок. Подскажите, что нужно добавить в код, чтобы предотвратить подобную ситуацию?
фрагмент кода :
В bCheckOrders() перебор не только открытых но и отложенных ордеров (MODE_TRADES).
Добрый день. помогите решить проблему. на свече М15 открывается несколько сделок подряд.
Нужно, чтобы открывалось не более одной сделки. Логика советника так устроена, что пока не закроется предыдущий ордер, следующий - не откроется, но иногда на такой длинной свече открывается серия сделок. Подскажите, что нужно добавить в код, чтобы предотвратить подобную ситуацию?
voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если нет открытых ордеров, то входим в условиеif(bCheckOrders() == true)
{
// Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
}
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfitif(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
{
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
CloseOrder();
}
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
}
Попробуй так, убери bCheckOrders() из OnTick() и поставь как выделено.
voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfitif(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
{
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
CloseOrder();
}
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на покупку |//+-----------------------------------------------------------------------------------------------+void vOrderOpenBuy()
{
// Если нет открытых ордеров, то входим в условиеif(bCheckOrders() == true)
{
// Тикет ордераint iOTi = 0;
iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
else// Если нет, то получим ошибку
vError(GetLastError());
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на продажу |//+-----------------------------------------------------------------------------------------------+void vOrderOpenSell()
{
// Если нет открытых ордеров, то входим в условиеif(bCheckOrders() == true)
{
// Тикет ордера int iOTi = 0;
iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
else// Если нет, то получим ошибку
vError(GetLastError());
}
}
Удалил лишний код.
чтобы это значило?
Чтобы можно было рассчитать эти данные на разных ТФ.
Интересно у кого ни будь есть реализация через класс.
Щас пытаюсь разобраться в логике классов , было бы подспорьем для обучения.
Добрый день. помогите решить проблему. на свече М15 открывается несколько сделок подряд.
Нужно, чтобы открывалось не более одной сделки. Логика советника так устроена, что пока не закроется предыдущий ордер, следующий - не откроется, но иногда на такой длинной свече открывается серия сделок. Подскажите, что нужно добавить в код, чтобы предотвратить подобную ситуацию?
фрагмент кода :
Эм... в iOTi в vOrderModify() всегда = 1, там не тикет, а положительный результат выполнения операции OrderSend() то есть значение "1".
спасибо. изначальный код не мой, поэтому ничего без надобности не меняю. Работает и работает.
это как то поможет решить мою проблему?
Добрый день. помогите решить проблему. на свече М15 открывается несколько сделок подряд.
Нужно, чтобы открывалось не более одной сделки. Логика советника так устроена, что пока не закроется предыдущий ордер, следующий - не откроется, но иногда на такой длинной свече открывается серия сделок. Подскажите, что нужно добавить в код, чтобы предотвратить подобную ситуацию?
фрагмент кода :
Я просто ищу кто может поделиться наработкой по реализации интеграции индикатора в эксперт
Чтобы можно было рассчитать эти данные на разных ТФ.
Интересно у кого ни будь есть реализация через класс.
Щас пытаюсь разобраться в логике классов , было бы подспорьем для обучения.
rates_total = Bars time[] = Time[] open[] = Open[] high[] = High[] low[] = Low[] close[] = Close[]Покажи OnTick()
спасибо. изначальный код не мой, поэтому ничего без надобности не меняю. Работает и работает.
это как то поможет решить мою проблему?
Попробуй так, убери bCheckOrders() из OnTick() и поставь как выделено.
Не, я ошибся, OrderSend() возвращает тикет или -1, так что там все в порядке с этим.
хорошо.
я учту на будущее