Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Да, - пожалуй! Благодарю, TheXpert !
Сейчас попробую!
Я не знаток. У меня по этой функции в моей "справочной" папке помимо всего "штатного" есть вот такое примечание (скопировал его здесь же, - не помню с какой ветки) -
А функция OrderCloseBy используется ТОЛЬКО для одновременного закрытия 2х ордеров, при этом экономится один спред.
Нужно программно пройтись по терминалу, запомнить все номера открытых ордеров и их характеристики, выбрать номер основного ордера, подобрать под него желаемый (из имеющихся) встречный ордер, и его-то номер и подставить.
// Т.е. как я понимаю, с помощью этой функции можно только закрыть две встречные позиции, предварительно выбранные.
И не более того.
Ну да...
она ж и называется потому так.
Ну тогда переформулирую вопрос есть ли экономическая разница в следующих двух вариантах разворота позиции:
1) Закрыть SELL объёмом 1 лот функцией OrderClose и затем открыть BUY объёмом в 1 лот
2) При открытом SELL объёмом в 1 лот сначала открыть BUY объёмом 2 лота и затем закрыть SELL функцией OrderCloseBy, после чего также останется открытая позиция по BUY объёмом 1 лот.
По примеру из учебника один спред во 2) варианте будет сохранён.
https://book.mql4.com/ru/trading/orderclose - вот тут описано действие функции OrderCloseBy(). Попробовал проделать то же самое на демо - реально на спред меньше получается. Но всё равно на эксперте не работает... Запутался короче я...
С этим вопросом вы в двух ветках засветились. Пытливый вы наш.
Простых решений здесь нет. С выходом MQL5 эта проблема вообще исчезнет.
Могу предложить пару процедур, используемых мною в советниках.
//Определение текущего состояния открытых ордеров:
void CheckOrders()
{
int i;
BuyOrder = false;
SellOrder = false;
BuyLots = 0.0;
SellLots = 0.0;
for ( i=0; i < OrdersTotal(); i++)
{
OrderSelect(i, SELECT_BY_POS);
if ( OrderSymbol() == Symbol())
{
if ( OrderType() == OP_BUY )
{
BuyOrder = true;
LastBuyLots = OrderLots();
BuyLots += LastBuyLots; // сумма открытых поз на покупку
BuyTicket = OrderTicket();
}
if ( OrderType() == OP_SELL)
{
SellOrder = true;
LastSellLots = OrderLots();
SellLots += LastSellLots; // сумма открытых поз на продажу
SellTicket = OrderTicket();
}
}
}
}
//Открытие(закрытие) ордеров:
void TradeVariant( int variant )
{
switch( variant )
{
// if (Pattern < 0 && !BuyOrder && !SellOrder && !FridayLastHour) variant = 1;
// сигнал на продажу, нет открытых ордеров и это не последний час пятницы
// открываем ордер на продажу
case 1:
OpenSellOrder(Lots);
break;
// if (Pattern < 0 && BuyOrder && !SellOrder && !FridayLastHour) variant = 2;
// сигнал на продажу, есть открытый ордер на покупку, нет ордера на продажу
// и это не последний час пятницы - переворачиваемся
case 2:
OpenSellOrder(Lots + BuyLots);
break;
// if (Pattern < 0 && BuyOrder && !SellOrder && FridayLastHour) variant = 3;
// сигнал на продажу, есть открытый ордер на покупку, нет ордера на продажу
// и это последний час пятницы - закрываем ордер на покупку
case 3:
CloseBuyOrders();
break;
// if (Pattern > 0 && !SellOrder && !BuyOrder && !FridayLastHour) variant = 4;
// сигнал на покупку, нет открытых ордеров и это не последний час пятницы
// открываем ордер на покупку
case 4:
OpenBuyOrder(Lots);
break;
// if (Pattern > 0 && SellOrder && !BuyOrder && !FridayLastHour) variant = 5;
// сигнал на покупку, есть открытый ордер на продажу, нет ордера на покупку
// и это не последний час пятницы - переворачиваемся
case 5:
OpenBuyOrder(Lots + SellLots);
break;
// if (Pattern > 0 && SellOrder && !BuyOrder && FridayLastHour) variant = 6;
// сигнал на покупку, есть открытый ордер на продажу, нет ордера на покупку
// и это последний час пятницы - закрываем ордер на продажу
case 6:
CloseSellOrders();
break;
case 7:
// if (SellOrder && BuyOrder) variant = 7;
// имеем открытые перекрестные одера
if (WaitBeforeTransaction(WaitSeconds) == 1) // пауза между запросами
{
if (LastBuyLots <= LastSellLots)
OrderCloseBy( BuyTicket, SellTicket);
else
OrderCloseBy( SellTicket, BuyTicket);
}
break;
// в остальных вариантах ничего не делаем
default:
break;
}
}
Надеюсь, с переменными вы разберетесь.
Удачи!