Открытие сделок

 
Добрый день. Может кто подсказать по коду, делаю советника он должен открывать от текущей цены сделку на продажу и сделку на покупку но порядок открытия должен быть таков что сделка Sell всегда выше сделки Buy. Но перепробовал множество уже вариаций всегда получается сначала buy а ниже идет sell. Вот фрагмент кода void OnTick()
{
double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double currentSpread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);

MqlTradeResult result; // Переменная result объявляется здесь

// Проверяем, есть ли открытые позиции и спред не превышает максимальное значение
if (PositionsTotal() == 0 && currentSpread <= MaxSpread)
{
// Открываем позицию на продажу
MqlTradeRequest request_sell;
ZeroMemory(request_sell);

request_sell.action = TRADE_ACTION_DEAL;
request_sell.symbol = _Symbol;
request_sell.volume = 0.01;
request_sell.type = ORDER_TYPE_SELL;
request_sell.price = currentPrice;
request_sell.sl = 0;//currentPrice + 300 * _Point;
request_sell.tp = 0;//currentPrice — 300 * _Point;

OrderSend(request_sell, result);


// Открываем позицию на покупку
MqlTradeRequest request_buy;
ZeroMemory(request_buy);

request_buy.action = TRADE_ACTION_DEAL;
request_buy.symbol = _Symbol;
request_buy.volume = 0.01;
request_buy.type = ORDER_TYPE_BUY;
request_buy.price = currentPrice + 200 * _Point;
request_buy.sl = 0;//currentPrice — 300 * _Point;
request_buy.tp = 0;//currentPrice + 300 * _Point;

OrderSend(request_buy, result);

}
 
harrison90:
Добрый день. Может кто подсказать по коду, делаю советника он должен открывать от текущей цены сделку на продажу и сделку на покупку но порядок открытия должен быть таков что сделка Sell всегда выше сделки Buy. Но перепробовал множество уже вариаций всегда получается сначала buy а ниже идет sell. Вот фрагмент кода void OnTick()
{
double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double currentSpread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);

MqlTradeResult result; // Переменная result объявляется здесь

// Проверяем, есть ли открытые позиции и спред не превышает максимальное значение
if (PositionsTotal() == 0 && currentSpread <= MaxSpread)
{
// Открываем позицию на продажу
MqlTradeRequest request_sell;
ZeroMemory(request_sell);

request_sell.action = TRADE_ACTION_DEAL;
request_sell.symbol = _Symbol;
request_sell.volume = 0.01;
request_sell.type = ORDER_TYPE_SELL;
request_sell.price = currentPrice;
request_sell.sl = 0;//currentPrice + 300 * _Point;
request_sell.tp = 0;//currentPrice — 300 * _Point;

OrderSend(request_sell, result);


// Открываем позицию на покупку
MqlTradeRequest request_buy;
ZeroMemory(request_buy);

request_buy.action = TRADE_ACTION_DEAL;
request_buy.symbol = _Symbol;
request_buy.volume = 0.01;
request_buy.type = ORDER_TYPE_BUY;
request_buy.price = currentPrice + 200 * _Point;
request_buy.sl = 0;//currentPrice — 300 * _Point;
request_buy.tp = 0;//currentPrice + 300 * _Point;

OrderSend(request_buy, result);

}

Добрый день! Ваше желание осуществимо, но потребует усложнения кода.

Поэтому советую сначала Ваш код упростить за счет применения библиотеки Trade, входящей в дистрибутив терминала. Вот для Sell

#include <Trade\Trade.mqh>
CTrade trade;

.................

   trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,Lot,
                      SymbolInfoDouble(_Symbol,SYMBOL_BID),
                      NormalizeDouble(Ask + SL*_Point,_Digits),
                      NormalizeDouble(Bid - TP*_Point,_Digits),
                      TimeToString(TimeCurrent(),TIME_SECONDS));
Аналогично для Buy. Пробуйте сначала на Демо-счете.
 
Вы убедитесь, что получившийся код много короче и выполняет те же функции, что и Ваш. Далее сделаем, чтобы сделка Sell была выше сделки Buy.
 
Селл будет выше бая, только если баевая сделка пройдет некоторое расстояние вверх.
 
harrison90:
Может кто подсказать по коду, делаю советника он должен открывать от текущей цены сделку на продажу и сделку на покупку но порядок открытия должен быть таков что сделка Sell всегда выше сделки Buy.

Может быть я чего-то не понимаю, но если бы это можно было сделать, просто написав код, то все, кто обладает минимальными знаниями в этой области, давно бы стали миллиардерами.

Иными словами, задача не имеет решения. Сделка Sell может быть открыта выше сделки Buy не всегда, а только в том случае, если после открытия сделки Sell цена пройдёт вниз некоторое расстояние (как минимум спред + 1 пипс). Или наоборот, как описал @Petr Voytenko чуть выше. 

 

harrison90:
{
double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);

(...)

// Открываем позицию на покупку
MqlTradeRequest request_buy;
ZeroMemory(request_buy);

request_buy.action = TRADE_ACTION_DEAL;
request_buy.symbol = _Symbol;
request_buy.volume = 0.01;
request_buy.type = ORDER_TYPE_BUY;
request_buy.price = currentPrice + 200 * _Point;
request_buy.sl = 0;//currentPrice — 300 * _Point;
request_buy.tp = 0;//currentPrice + 300 * _Point;

OrderSend(request_buy, result);

}

Код, представленный вами, очень странный. Даже если бы он работал, то не мог бы решить поставленную задачу, потому что в запросе на открытие сделки Buy указывается цена на 200 пипсов выше, чем цена открытия сделки Sell (Bid).

Но работать этот код не будет в силу того, что при отправке запроса на размещение рыночного Buy ордера ( TRADE_ACTION_DEAL ) вы должны указывать цену Ask ( SymbolInfoDouble(_Symbol, SYMBOL_ASK) ). Посмотрите самый первый пример вот здесь.

 
Petr Voytenko #:
Селл будет выше бая, только если баевая сделка пройдет некоторое расстояние вверх.

Спасибо, что подтвердили наличие одного из вариантов решения. Именно этого и следует добиться автору ветки!!! И аналогично для селлевой сделки. Но есть комплексное решение...

А что случилось с Вашим сигналом Clap Clap ???

 
Petr Voytenko #:
Селл будет выше бая, только если баевая сделка пройдет некоторое расстояние вверх.
предлагаемый Вами способ только для баевой сделки. Есть универсальный способ
 
Konstantin Erin #:
Спасибо, что подтвердили наличие одного из вариантов решения
Konstantin Erin #:
Есть универсальный способ

Я всё-таки ещё раз выскажу своё мнение, что задача, поставленная ТС, не имеет решения. Без вариантов. Во всяком случае применительно к маржинальной торговле.

ТС с самого начала написал, что от текущей цены должно открываться две сделки, одна на продажу, другая на покупку. При этом цена открытия сделки Sell должна быть всегда выше цены открытия сделки Buy.

Предположим, что первой открывается сделка SELL (как в коде, предложенном ТС). Она, как известно, открывается по цене Bid. Чтобы открыть сделку BUY по цене ниже, чем была открыта SELL, нужно дождаться, пока цена Ask станет ниже цены открытия сделки SELL, верно? Но цена с той же вероятностью (50%) может пойти вверх и через некоторое время открытая позиция SELL закроется по стоп-ауту.

Иными словами, обеспечить желаемый автором вопроса порядок открытия сделок возможно не всегда, а только в том случае, если цена пройдёт расстояние, равное спреду + 1 пункт в направлении позиции, которая была открыта первой. И сделает она это раньше, чем на счёте наступит стоп-аут за счёт движения цены в противоположном направлении.

 
harrison90:
Добрый день. Может кто подсказать по коду, делаю советника он должен открывать от текущей цены сделку на продажу и сделку на покупку но порядок открытия должен быть таков что сделка Sell всегда выше сделки Buy. Но перепробовал множество уже вариаций всегда получается сначала buy а ниже идет sell. Вот фрагмент кода void OnTick()
{
double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double currentSpread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);

MqlTradeResult result; // Переменная result объявляется здесь

// Проверяем, есть ли открытые позиции и спред не превышает максимальное значение
if (PositionsTotal() == 0 && currentSpread <= MaxSpread)
{
// Открываем позицию на продажу
MqlTradeRequest request_sell;
ZeroMemory(request_sell);

request_sell.action = TRADE_ACTION_DEAL;
request_sell.symbol = _Symbol;
request_sell.volume = 0.01;
request_sell.type = ORDER_TYPE_SELL;
request_sell.price = currentPrice;
request_sell.sl = 0;//currentPrice + 300 * _Point;
request_sell.tp = 0;//currentPrice — 300 * _Point;

OrderSend(request_sell, result);


// Открываем позицию на покупку
MqlTradeRequest request_buy;
ZeroMemory(request_buy);

request_buy.action = TRADE_ACTION_DEAL;
request_buy.symbol = _Symbol;
request_buy.volume = 0.01;
request_buy.type = ORDER_TYPE_BUY;
request_buy.price = currentPrice + 200 * _Point;
request_buy.sl = 0;//currentPrice — 300 * _Point;
request_buy.tp = 0;//currentPrice + 300 * _Point;

OrderSend(request_buy, result);

}
Для этого существуют лимитные ордера. В которых ставите от тек цены лимитку селл поцене выше текущей. А цену сработки бай лимит - ставите ниже текущей цены и все.
 
Janis Ozols #:

Я всё-таки ещё раз выскажу своё мнение, что задача, поставленная ТС, не имеет решения. Без вариантов. Во всяком случае применительно к маржинальной торговле.

ТС с самого начала написал, что от текущей цены должно открываться две сделки, одна на продажу, другая на покупку. При этом цена открытия сделки Sell должна быть всегда выше цены открытия сделки Buy.

Предположим, что первой открывается сделка SELL (как в коде, предложенном ТС). Она, как известно, открывается по цене Bid. Чтобы открыть сделку BUY по цене ниже, чем была открыта SELL, нужно дождаться, пока цена Ask станет ниже цены открытия сделки SELL, верно? Но цена с той же вероятностью (50%) может пойти вверх и через некоторое время открытая позиция SELL закроется по стоп-ауту.

Иными словами, обеспечить желаемый автором вопроса порядок открытия сделок возможно не всегда, а только в том случае, если цена пройдёт расстояние, равное спреду + 1 пункт в направлении позиции, которая была открыта первой. И сделает она это раньше, чем на счёте наступит стоп-аут за счёт движения цены в противоположном направлении.

Вы начали сами себе противоречить.

Сначала " задача, поставленная ТС, не имеет решения. Без вариантов "

Потом " обеспечить желаемый автором вопроса порядок открытия сделок возможно "

Кто мешает довести возможность до 100 %   ????

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