Значение выражения определяется до выполнения оператора. Следовательно, если выражение ложно с самого начала, то оператор вообще
не выполняется.
Непонятно для чего используется цикл..
Я полял так..
while(OrderCloseTime() == 0) // Если выражение (OrderCloseTime() == 0) истинно, то..
{
функция 1; // оператор (функция 1) выполняется до тех пор, пока выражение не станет ложным
}
while(OrderCloseTime() != 0) // Если выражение (OrderCloseTime() != 0) истинно, то..
{
функция 2; // оператор (функция 2) выполняется до тех пор, пока выражение не станет ложным
}
Оператор цикла 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);
}
}
}
}
}
Я бы сделал проще:
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; 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;
{
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
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
{
функция 1
}
{
функция 2
}
"Функция 1" - работает.
Но при закрытии ордера не переключается на "функцию 2".
while(OrderCloseTime()==0)
{
функция 2
}
{
функция 1
}
А так наоборот: "функция 2" - работает, "функция 1" - не работает.
Всем спасибо