Вопрос к знатокам - страница 13

 

Да, - пожалуй! Благодарю, TheXpert  !

Сейчас попробую!

 
Уважаемые знатоки, помогите, пожалуйста, разобраться с функцией OrderCloseBy(). Что-то я совсем запутался. У меня есть эксперт, который открывает и закрывает позиции по зеркально противоположным условиям. То есть условия OPEN BUY и CLOSE SELL совпадают, также как и OPEN SELL и CLOSE BUY, таким образом сразу после закрытия одной позиции по той же цене открывается позиция в другую сторону с тем же объёмом. Вот я и решил попробовать заменить OrderClose(), открытием позиции в противоположную сторону в удвоенном объёме и затем закрытием встречных ордеров функцией OrderCloseBy(). То есть получиться должно было в итоге тоже, но с экономией одного спреда с каждой сделки, но что-то тестер показывает совсем другое. Вот я и не могу понять, то ли я код неправильно написал, то ли сама идея мной неправильно понята... Очень буду благодарен Вам за разъяснения...
 
Первым делом, уточните в техподдержке Вашего ДЦ, поддерживается ли терминалом работа этой функции. Т.к. не во всех ДЦ ф-я OrderCloseBy() разрешена к применению.
 
На демо OrderCloseBy()  поддерживается.
 

Я не знаток. У меня по этой функции в моей "справочной" папке помимо всего "штатного" есть вот такое примечание (скопировал его здесь же, - не помню с какой ветки) - 

А функция OrderCloseBy используется ТОЛЬКО для одновременного закрытия 2х ордеров, при этом экономится один спред.
Нужно программно пройтись по терминалу, запомнить все номера открытых ордеров и их характеристики, выбрать номер основного ордера, подобрать под него желаемый (из имеющихся) встречный ордер, и его-то номер и подставить.


// Т.е. как я понимаю, с помощью этой функции можно только закрыть две встречные позиции, предварительно выбранные.

И не более того. 

 

Ну да...

она ж и называется потому так.

 

Ну тогда переформулирую вопрос есть ли экономическая разница в следующих двух вариантах разворота позиции:

1) Закрыть SELL объёмом 1 лот функцией OrderClose и затем открыть BUY объёмом в 1 лот

2) При открытом SELL объёмом в 1 лот сначала открыть BUY объёмом 2 лота и затем закрыть SELL функцией OrderCloseBy, после чего также останется открытая позиция по BUY объёмом 1 лот.

По примеру из учебника один спред во 2) варианте будет сохранён.

 
Ежли кратко, то 1+1 спред компенсирутся, а остаток 1 будет обычный спред по торг.условиям.
 
https://book.mql4.com/ru/trading/orderclose - вот тут описано действие функции OrderCloseBy(). Попробовал проделать то же самое на демо - реально на спред меньше получается. Но всё равно на эксперте не работает... Запутался короче я...
 
Dmirtiy писал(а) >>
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;
}
}

Надеюсь, с переменными вы разберетесь.

Удачи!

Причина обращения: