MQL4 - automated forex trading   /  

Форум

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

К списку тем  | 1 2 Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

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

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

Всем спасибо

Бесплатная Groupware для групп разработчиков

Установите систему групповой работы TeamWox и объедините усилия всех разработчиков. Это поможет вашей команде работать быстрее и организованнее. Благодаря TeamWox станет намного проще ставить задачи и контролировать их выполнение.


avatar
Модератор
3649
Renat 14.08.2006 14:21 
А почему Вы каждую функцию в фигурные скобки берете?

avatar
14054
komposter 14.08.2006 14:29 
OrderSelect() где?

avatar
144
DEan 14.08.2006 14:40 
qee писал (а):
"Функция 1" - работает.
Но при закрытии ордера не переключается на "функцию 2".

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

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

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

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

avatar
135
qee 14.08.2006 19:49 
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);
}
}
}
}
}


avatar
14054
komposter 14.08.2006 21:16 
У позиции из MODE_TRADES OrderCloseTime() всегда = 0 ;)

avatar
14054
komposter 14.08.2006 21:23 
И, как по мне, нельзя писать экспертов так...
Я бы сделал проще:
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: код не проверял, могут быть опечатки ;)

avatar
135
qee 15.08.2006 07:43 
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);
}
}
}
}
}

Не работает опять.
Ордер закрывается, но вместо него ничего не открывается.


avatar
14054
komposter 15.08.2006 12:25 
Зачем коверкать мой код, а потом говорить, что он не работает?
bool isExpertPosition = false; должно быть в функции start

avatar
135
qee 15.08.2006 14:24 
komposter писал (а):
Зачем коверкать мой код, а потом говорить, что он не работает?
bool isExpertPosition = false; должно быть в функции start

Понял. Исправил. Пошел тестить.

avatar
135
qee 15.08.2006 14:41 
komposter писал (а):
Зачем коверкать мой код, а потом говорить, что он не работает?
bool isExpertPosition = false; должно быть в функции start

Работает. СПАСИБО.
К списку тем   | 1 2  

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий