Открытие одновременно и вниз и вверх! Как сделать?

 

Как будет выглядеть код для открытия в одну сторону знаешь? В другую тоже знаешь? А между ними ставишь RefrasheRates().

 
< Как будет выглядеть код для открытия в одну сторону знаешь? В другую тоже знаешь? А между ними ставишь RefrasheRates(). >

С обязательным тайм-аутом, если торговый поток занят:
//+------------------------------------------------------------------+
//| Проверка состояния торгового потока - можно ли торговать         |
//+------------------------------------------------------------------+
void CheckTradeContext(int time_out)
 {
 //----
  if (!IsTesting())
   {
    // если торговый поток занят, "засыпаем" на случайное время, не меньшее тайм-аута
    while (IsTradeContextBusy() == true)
     { Sleep(time_out * MathRound(1000. * (1.0 + (MathRand() / 32768.)))); } 
   }
 //----
  return;
 }
Что-то вроде этого. Грубо, но работает. Я беру тайм-аут от 30 секунд.
 

Вообще если надо стопудово открыть второй ордер, то следует поставить флаг в статической переменной о необходимости открытия и обнулять его после успешного открытия, еще потребуется выполнять проверку не ушла ли цена далеко и не прошло ли слишком много времени и в соответствии с этим принимать необходимые меры.

 

Вот-вот. Работы тут - вагон и маленькая тележка, со всеми необходимыми проверками. Еще слава богу, что надобность в глобальных переменных (семафорах) для контроля состояния, если не отпала совсем, то значительно сократилась.

 
{    //Low[1]-Delta*Point,Ask+TakeProfit*Point
  ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5,Ask-Stop*Point,0,
                   "priceEX",16384,0,Green);
  if(ticket>0)
    {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
          Print("BUY order opened : ",OrderOpenPrice()); //MODE_TRADES
    }
  else 
      Print("Error opening BUY order : ",GetLastError()); 
  return(0); 
}
 
{    //Bid+TrailingStop*Point,Bid-TakeProfit*Point
  ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,5,Bid+Stop*Point,
                     0,"priceEX",16384,0,Red);
  if(ticket>0)
    {                                    
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
          Print("SELL order opened : ",OrderOpenPrice()); //,MODE_TRADES
    }
  else 
      Print("Error opening SELL order : ",GetLastError()); 
  return(0); 
}

а зачем нужен RefrasheRates(). и куда вставить его? в документации ничего не понятно, объясните поподробнее пожалуйста. Вообже идея такая: открываем одновременно buy sell потом при достижении определенноо уровня тейк профит закрывается одна позиция например buy и в этот момент открываем sell но в два раза больше закрытого buy и тейк профит в два раза меньше. Как сделать это?
 
// < а зачем нужен RefrasheRates(). и куда вставить его? >
// Например, сюда (в минус первом приближении):
//
RefreshRates(); // обновляем цены перед открытием первого ордера
//
{   //Low[1]-Delta*Point,Ask+TakeProfit*Point
  ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5,Ask-Stop*Point,0,
                   "priceEX",16384,0,Green);
  if(ticket>0)
    {
      f(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
          Print("BUY order opened : ",OrderOpenPrice()); //MODE_TRADES
    }
  else 
      Print("Error opening BUY order : ",GetLastError()); 
  return(0); 
}
// проверяем, свободен ли торговый поток - см. список ошибок 
// времени выполнения при операциях с ордерами
CheckTradeContext(TimeOut); // extern int TimeOut = 30; 
// тайм-аут в секундах - во внешних настройках
RefreshRates(); // обновляем цены перед открытием второго ордера
//
{  //Bid+TrailingStop*Point,Bid-TakeProfit*Point
  ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,5,Bid+Stop*Point,
                   0,"priceEX",16384,0,Red);
  if(ticket>0)
    {                                    
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
          Print("SELL order opened : ",OrderOpenPrice()); //,MODE_TRADES
    }
  else 
      Print("Error opening SELL order : ",GetLastError()); 
  return(0); 
}
// Насчет  RefreshRates() в документации хорошо написано, зачем это нужно.
// Да и на форумах, здешнем и соседнем, эта тема много раз обсуждалась. Поищи.
 
а зачем нужен RefrasheRates(). и куда вставить его? в документации ничего не понятно, объясните поподробнее пожалуйста. Вообже идея такая: открываем одновременно buy sell потом при достижении определенноо уровня тейк профит закрывается одна позиция например buy и в этот момент открываем sell но в два раза больше закрытого buy и тейк профит в два раза меньше. Как сделать это?

RefreshRates(): Bid и Ask имеют значение цены, которое было на момент начала выполнения функции start(), пока один ордер открывается, цена может измениться и у второго будет реквоте, поэтому надо обновить значение котировок RefresheRates() и отправлять второй ордер по текущей цене.

Если знаешь точку в которой следует закрыть один ордер и открыть удвоенный, то проще открыть один ордер в этот момент. Но если эта подпорка помогает, то всеравно лучше отметить точку в которой типа открываешь два ордера, потом в точке в которой типа должен закрыть и открыть удвоенный - открыться один раз.
 
projectX писал (а):

Вообже идея такая: открываем одновременно buy sell потом при достижении определенноо уровня тейк профит закрывается одна позиция например buy и в этот момент открываем sell но в два раза больше закрытого buy и тейк профит в два раза меньше. Как сделать это?

Ты так на один спред будешь работать... Зачем вообще открывать два разнонаправленных ордера? Запоминай текущее положение цены и дальше контролируй отклонение от неё. Цены запоминай в глобальных переменных или выгружай во внешний файл для устойчивости эксперта к перезапускам.
 
projectX писал (а):
а зачем нужен RefrasheRates(). и куда вставить его? в документации ничего не понятно, объясните поподробнее пожалуйста. Вообже идея такая: открываем одновременно buy sell потом при достижении определенноо уровня тейк профит закрывается одна позиция например buy и в этот момент открываем sell но в два раза больше закрытого buy и тейк профит в два раза меньше. Как сделать это?
Не нужно никакого освежителя. Потому, что задача по условию выполняется совсем иным образом. То бишь не открываешь сразу две встречные (лишняя возня), а ставишь отложенные StopLimit ордера, на тех местах, где раньше планировал ставить тейки c заранее выставленными удвоенными тейками.

Встречной позицией лучше всего локировать уже открытый ордер, если по тех. или фунд. анализу сложно определить куда наиболее вероятно двинет цена.
Причина обращения: