Помогите разбраться

 
while(OrderCloseTime()==0)
{
функция 1
}
{
функция 2
}
"Функция 1" - работает.
Но при закрытии ордера не переключается на "функцию 2".

while(OrderCloseTime()==0)
{
функция 2
}
{
функция 1
}
А так наоборот: "функция 2" - работает, "функция 1" - не работает.

Всем спасибо
 
А почему Вы каждую функцию в фигурные скобки берете?
 
OrderSelect() где?
 
qee писал (а):
"Функция 1" - работает.
Но при закрытии ордера не переключается на "функцию 2".

Оператор цикла while Если выражение истинно, то оператор выполняется до тех пор, пока выражение не станет ложным. Если выражение ложно, то управление передается следующему оператору.

while(выражение) оператор;

Значение выражения определяется до выполнения оператора. Следовательно, если выражение ложно с самого начала, то оператор вообще
не выполняется.

Непонятно для чего используется цикл..
Я полял так..
while(OrderCloseTime() == 0) // Если выражение (OrderCloseTime() == 0) истинно, то..
{
функция 1; // оператор (функция 1) выполняется до тех пор, пока выражение не станет ложным
}
while(OrderCloseTime() != 0) // Если выражение (OrderCloseTime() != 0) истинно, то..
{
функция 2; // оператор (функция 2) выполняется до тех пор, пока выражение не станет ложным
}
 
DEan писал (а):
qee писал (а):
"Функция 1" - работает.
Но при закрытии ордера не переключается на "функцию 2".

Оператор цикла while Если выражение истинно, то оператор выполняется до тех пор, пока выражение не станет ложным. Если выражение ложно, то управление передается следующему оператору.

while(выражение) оператор;

Значение выражения определяется до выполнения оператора. Следовательно, если выражение ложно с самого начала, то оператор вообще
не выполняется.

Непонятно для чего используется цикл..
Я полял так..
while(OrderCloseTime() == 0) // Если выражение (OrderCloseTime() == 0) истинно, то..
{
функция 1; // оператор (функция 1) выполняется до тех пор, пока выражение не станет ложным
}
while(OrderCloseTime() != 0) // Если выражение (OrderCloseTime() != 0) истинно, то..
{
функция 2; // оператор (функция 2) выполняется до тех пор, пока выражение не станет ложным
}


Вот сама программа.
Программа трэйлит позицию, а после срабатывания стоп-лосса открывает ордер в доугом направлении


extern double Lots = 0.1;
extern int StopLoss = 30;
extern int Slippage = 10;
extern int TrailingStop = 30;

void start()
{
for (int g=OrdersTotal()-1; g>=0; g--)
{
if (OrderSelect(g, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY)
{
while(OrderCloseTime()==0)
{
TrailingStop();
}
{
double pp1 = MarketInfo(Symbol(), MODE_POINT);
double pBid = MarketInfo(Symbol(), MODE_BID);
OrderSend(Symbol(), OP_SELL, Lots, pBid, Slippage, pBid+StopLoss*pp1, 0, "", 0,0);
}
}
if (OrderType()==OP_SELL)
{
while(OrderCloseTime()==0)
{
TrailingStop();
}
{
double pp2 = MarketInfo(Symbol(), MODE_POINT);
double pAsk = MarketInfo(Symbol(), MODE_ASK);
OrderSend(Symbol(), OP_BUY, Lots, pAsk, Slippage, pAsk-StopLoss*pp2, 0,"", 0, 0);
}
}
}
}
}
}
void TrailingStop()
{
for (int j=OrdersTotal()-1; j>=0; j--)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol()==Symbol())
{
double pp = MarketInfo(Symbol(),MODE_POINT);
double pAsk1 = MarketInfo(Symbol(),MODE_ASK);
double pBid2 = MarketInfo(Symbol(),MODE_BID);
if (OrderType()==OP_BUY)
{
if (pAsk1-OrderStopLoss()<TrailingStop*pp)
continue;
else
double b = pAsk1-TrailingStop*pp;
OrderModify(OrderTicket(), OrderOpenPrice(), b,OrderTakeProfit(), 0,CLR_NONE);
}
if (OrderType()==OP_SELL)
{
if (OrderStopLoss()-pBid2<TrailingStop*pp)
continue;
else
double d = pBid2+TrailingStop*pp;
OrderModify(OrderTicket(), OrderOpenPrice(), d,OrderTakeProfit(), 0,CLR_NONE);
}
}
}
}
}

 
У позиции из MODE_TRADES OrderCloseTime() всегда = 0 ;)
 
И, как по мне, нельзя писать экспертов так...
Я бы сделал проще:
extern double Lots         = 0.1;
extern int    StopLoss     = 30;   
extern int    Slippage     = 10;
extern int    TrailingStop = 30;
void start()
    {
int lastpos = -1; bool isExpertPosition = false;
    for (int g=OrdersTotal()-1; g>=0; g--)
    {
    if (OrderSelect(g, SELECT_BY_POS, MODE_TRADES))
      {
      if (OrderSymbol()==Symbol())
         {
         if (OrderType()==OP_BUY)
            {
               TrailingStop();
               isExpertPosition = true;
               lastpos = OP_BUY;
            }
         if (OrderType()==OP_SELL)      
            {
               TrailingStop();
               isExpertPosition = true;
               lastpos = OP_SELL;
               }
            }         
        }
      }
    }
  if ( !isExpertPosition )
  {
    if ( lastpos == OP_BUY )
    {
        double pp1 = MarketInfo(Symbol(),MODE_POINT);
        double pBid = MarketInfo(Symbol(),MODE_BID);
        OrderSend(Symbol(),OP_SELL,Lots,pBid,Slippage,pBid+StopLoss*pp1,0,"",0,0);  
    }
    if ( lastpos == OP_SELL )
   {              
        double pp2 = MarketInfo(Symbol(),MODE_POINT);
        double pAsk = MarketInfo(Symbol(),MODE_ASK);
        OrderSend(Symbol(),OP_BUY,Lots,pAsk,Slippage,pAsk-StopLoss*pp2,0,"",0,0);              
    }
   }
  }
void TrailingStop()
  {
  for (int j=OrdersTotal()-1; j>=0; j--)
    {
    if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
      {
      if (OrderSymbol()==Symbol())
        {
        double pp = MarketInfo(Symbol(),MODE_POINT);
        double pAsk1 = MarketInfo(Symbol(),MODE_ASK);
        double pBid2 = MarketInfo(Symbol(),MODE_BID);
        if (OrderType()==OP_BUY)
          {
          if (pAsk1-OrderStopLoss()<TrailingStop*pp)
          continue;
          else
          double b = pAsk1-TrailingStop*pp;
          OrderModify(OrderTicket(),OrderOpenPrice(),b,OrderTakeProfit(),0,CLR_NONE);                   
          }       
        if (OrderType()==OP_SELL)
          {
          if (OrderStopLoss()-pBid2<TrailingStop*pp)
          continue;
          else             
          double d = pBid2+TrailingStop*pp;
          OrderModify(OrderTicket(),OrderOpenPrice(),d,OrderTakeProfit(),0,CLR_NONE);         
          }
        }
      }
    }
  }

ps: код не проверял, могут быть опечатки ;)
 
komposter писал (а):
И, как по мне, нельзя писать экспертов так...
Я бы сделал проще:
extern double Lots         = 0.1;
extern int    StopLoss     = 30;   
extern int    Slippage     = 10;
extern int    TrailingStop = 30;
void start()
    {
int lastpos = -1; bool isExpertPosition = false;
    for (int g=OrdersTotal()-1; g>=0; g--)
    {
    if (OrderSelect(g, SELECT_BY_POS, MODE_TRADES))
      {
      if (OrderSymbol()==Symbol())
         {
         if (OrderType()==OP_BUY)
            {
               TrailingStop();
               isExpertPosition = true;
               lastpos = OP_BUY;
            }
         if (OrderType()==OP_SELL)      
            {
               TrailingStop();
               isExpertPosition = true;
               lastpos = OP_SELL;
               }
            }         
        }
      }
    }
  if ( !isExpertPosition )
  {
    if ( lastpos == OP_BUY )
    {
        double pp1 = MarketInfo(Symbol(),MODE_POINT);
        double pBid = MarketInfo(Symbol(),MODE_BID);
        OrderSend(Symbol(),OP_SELL,Lots,pBid,Slippage,pBid+StopLoss*pp1,0,"",0,0);  
    }
    if ( lastpos == OP_SELL )
   {              
        double pp2 = MarketInfo(Symbol(),MODE_POINT);
        double pAsk = MarketInfo(Symbol(),MODE_ASK);
        OrderSend(Symbol(),OP_BUY,Lots,pAsk,Slippage,pAsk-StopLoss*pp2,0,"",0,0);              
    }
   }
  }
void TrailingStop()
  {
  for (int j=OrdersTotal()-1; j>=0; j--)
    {
    if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
      {
      if (OrderSymbol()==Symbol())
        {
        double pp = MarketInfo(Symbol(),MODE_POINT);
        double pAsk1 = MarketInfo(Symbol(),MODE_ASK);
        double pBid2 = MarketInfo(Symbol(),MODE_BID);
        if (OrderType()==OP_BUY)
          {
          if (pAsk1-OrderStopLoss()<TrailingStop*pp)
          continue;
          else
          double b = pAsk1-TrailingStop*pp;
          OrderModify(OrderTicket(),OrderOpenPrice(),b,OrderTakeProfit(),0,CLR_NONE);                   
          }       
        if (OrderType()==OP_SELL)
          {
          if (OrderStopLoss()-pBid2<TrailingStop*pp)
          continue;
          else             
          double d = pBid2+TrailingStop*pp;
          OrderModify(OrderTicket(),OrderOpenPrice(),d,OrderTakeProfit(),0,CLR_NONE);         
          }
        }
      }
    }
  }


ps: код не проверял, могут быть опечатки ;)



extern double Lots = 0.1;
extern int StopLoss = 30;
extern int Slippage = 10;
extern int TrailingStop = 30;
bool isExpertPosition = false;
int lastpos = -1;
void start()
{
for (int g=OrdersTotal()-1; g>=0; g--)
{
if (OrderSelect(g, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY)
{
TrailingStop();
isExpertPosition = true;
lastpos = OP_BUY;
}
if (OrderType()==OP_SELL)
{
TrailingStop();
isExpertPosition = true;
lastpos = OP_SELL;

}
}
}
}
if ( !isExpertPosition )
{
if ( lastpos == OP_BUY )
{
double pp1 = MarketInfo(Symbol(),MODE_POINT);
double pBid = MarketInfo(Symbol(),MODE_BID);
OrderSend(Symbol(),OP_SELL,Lots,pBid, Slippage, pBid+StopLoss*pp1, 0,"", 0,0);
}
if ( lastpos == OP_SELL )
{
double pp2 = MarketInfo(Symbol(),MODE_POINT);
double pAsk = MarketInfo(Symbol(),MODE_ASK);
OrderSend(Symbol(),OP_BUY,Lots,pAsk,Slippage, pAsk-StopLoss*pp2, 0, "", 0,0);
}
}
}

void TrailingStop()
{
for (int j=OrdersTotal()-1; j>=0; j--)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol()==Symbol())
{
double pp = MarketInfo(Symbol(),MODE_POINT);
double pAsk1 = MarketInfo(Symbol(),MODE_ASK);
double pBid2 = MarketInfo(Symbol(),MODE_BID);
if (OrderType()==OP_BUY)
{
if (pAsk1-OrderStopLoss()<TrailingStop*pp)
continue;
else
double b = pAsk1-TrailingStop*pp;
OrderModify(OrderTicket(), OrderOpenPrice(), b,OrderTakeProfit(), 0,CLR_NONE);
}
if (OrderType()==OP_SELL)
{
if (OrderStopLoss()-pBid2<TrailingStop*pp)
continue;
else
double d = pBid2+TrailingStop*pp;
OrderModify(OrderTicket(), OrderOpenPrice(), d,OrderTakeProfit(), 0,CLR_NONE);
}
}
}
}
}

Не работает опять.
Ордер закрывается, но вместо него ничего не открывается.
 
Зачем коверкать мой код, а потом говорить, что он не работает?
bool isExpertPosition = false; должно быть в функции start
 
komposter писал (а):
Зачем коверкать мой код, а потом говорить, что он не работает?
bool isExpertPosition = false; должно быть в функции start

Понял. Исправил. Пошел тестить.
 
komposter писал (а):
Зачем коверкать мой код, а потом говорить, что он не работает?
bool isExpertPosition = false; должно быть в функции start

Работает. СПАСИБО.
Причина обращения: