Уважаемые знатоки, помогите, пожалуйста, разобраться с функцией OrderCloseBy(). Что-то я совсем запутался. У меня есть эксперт, который открывает и закрывает позиции по зеркально противоположным условиям. То есть условия OPEN BUY и CLOSE SELL совпадают, также как и OPEN SELL и CLOSE BUY, таким образом сразу после закрытия одной позиции по той же цене открывается позиция в другую сторону с тем же объёмом. Вот я и решил попробовать заменить OrderClose(), открытием позиции в противоположную сторону в удвоенном объёме и затем закрытием встречных ордеров функцией OrderCloseBy(). То есть получиться должно было в итоге тоже, но с экономией одного спреда с каждой сделки, но что-то тестер показывает совсем другое. Вот я и не могу понять, то ли я код неправильно написал, то ли сама идея мной неправильно понята... Очень буду благодарен Вам за разъяснения...
Первым делом, уточните в техподдержке Вашего ДЦ, поддерживается ли терминалом работа этой функции. Т.к. не во всех ДЦ ф-я OrderCloseBy() разрешена к применению.
Я не знаток. У меня по этой функции в моей "справочной" папке помимо всего "штатного" есть вот такое примечание (скопировал его здесь же, - не помню с какой ветки) -
А функция 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(). Попробовал проделать то же самое на демо - реально на спред меньше получается. Но всё равно на эксперте не работает... Запутался короче я...
Dmirtiy писал(а)>> https://book.mql4.com/ru/trading/orderclose - вот тут описано действие функции OrderCloseBy(). Попробовал проделать то же самое на демо - реально на спред меньше получается. Но всё равно на эксперте не работает... Запутался короче я...
С этим вопросом вы в двух ветках засветились. Пытливый вы наш.
Простых решений здесь нет. С выходом MQL5 эта проблема вообще исчезнет.
Могу предложить пару процедур, используемых мною в советниках.
//Определение текущего состояния открытых ордеров:
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; } }
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Да, - пожалуй! Благодарю, 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;
}
}
Надеюсь, с переменными вы разберетесь.
Удачи!