Вопрос по MQL4: модифкация ордеров

 

Добрый день.

Я только начал изучение языка MQL4. Пробую тестировать различные советники. В настоящий момент не могу решить проблему модификации ордеров. Составил с помощью учебника вот такой вот советник (см.код ниже). Идея простая - при пересечении 24EMA открывать новую позу и закрывать предыдущую. Хочу тупо после открытия модифицировать открытый ордер (увеличить стоп на 5 пипс и уменьшить на 1 пипс TakeProfit).

Советник исполняет программу только в части открытия и закрытия позиций, а вот модифицировать не хочет (вообще не воспринимает эту часть программы). Пожалуйста, подскажите - в чём может быть ошибка? Заранее благодарен за совет.


#property copyright "Andrew Young"

// External variables
extern double LotSize=0.1;
extern double StopLoss=15;
extern double TakeProfit=30;

extern int Slippage=5;
extern int MagicNumber=123;

extern int EMAPeriod=24;

// Global variables
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

// Init function
int init()
{
UsePoint=PipPoint(Symbol());
UseSlippage=GetSlippage(Symbol(),Slippage);
}

// Start function
int start()
{
// Moving averages
double My_24EMA=iMA(NULL,0,EMAPeriod,0,MODE_EMA,PRICE_CLOSE,1);


// Buy order
if (Close[1]>My_24EMA && Close[2]<My_24EMA && BuyTicket == 0)
{
OrderSelect(SellTicket,SELECT_BY_TICKET);

// Close order
if(OrderCloseTime() == 0 && SellTicket > 0)
{
double CloseLots = OrderLots();
double ClosePrice = Ask;

bool Closed = OrderClose(SellTicket,CloseLots,ClosePrice,UseSlippage,Red);
}

double OpenPrice = Ask;

// Calculate stop loss and take profit
if (StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * UsePoint);
if (TakeProfit >0) double BuyTakeProfit = OpenPrice + (TakeProfit * UsePoint);

// Open buy order
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);

SellTicket = 0;

}

// Buy order modification

if (BuyTicket == 1)

{
OrderSelect(BuyTicket,SELECT_BY_TICKET);
double BuyStopLoss1 = OrderStopLoss()-5*UsePoint;
double BuyTakeProfit1 = OrderTakeProfit()-1*UsePoint;

if(IsTradeContextBusy()) Sl eep(10);
bool TicketMod = OrderModify(BuyTicket,OrderOpenPrice(),BuyStopLoss1,BuyTakeProfit1,0);

}

// Sell order
if (Close[1]<My_24EMA && Close[2]>My_24EMA && SellTicket == 0)
{
OrderSelect(BuyTicket,SELECT_BY_TICKET);

if(OrderCloseTime() == 0 && BuyTicket > 0)
{
CloseLots = OrderLots();
ClosePrice = Bid;

Closed = OrderClose(BuyTicket,CloseLots,ClosePrice,UseSlippage,Red);
}

OpenPrice = Bid;

if(StopLoss > 0) double SellStopLoss = OpenPrice + (StopLoss * UsePoint);
if(TakeProfit > 0) double SellTakeProfit = OpenPrice - (TakeProfit * UsePoint);

SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,OpenPrice,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);

BuyTicket = 0;

}

// Sell order modification
if (SellTicket == 1)
{
OrderSelect(SellTicket,SELECT_BY_TICKET);
double SellStopLoss1 = OrderStopLoss()+5*UsePoint;
double SellTakeProfit1 = OrderTakeProfit()+1*UsePoint;

if(IsTradeContextBusy()) Sl eep(10);
TicketMod = OrderModify(SellTicket,OrderOpenPrice(),SellStopLoss1,SellTakeProfit1,0);
}

return(0);

}

// Pip Point Function
double PipPoint(string Currency)
{
int CalcDigits = MarketInfo(Currency,MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return(CalcPoint);
}

// Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency,MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return(CalcSlippage);
}
 
if (BuyTicket == 1)

{
OrderSelect(BuyTicket,SELECT_BY_TICKET);
double BuyStopLoss1 = OrderStopLoss()-5*UsePoint;
double BuyTakeProfit1 = OrderTakeProfit()-1*UsePoint;

if(IsTradeContextBusy()) Sl eep(10);
bool TicketMod = OrderModify(BuyTicket,OrderOpenPrice(),BuyStopLoss1,BuyTakeProfit1,0);

}


Почему Вы считаете, что тикет будет равен единице?

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

 
Roger:


Почему Вы считаете, что тикет будет равен единице?

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


я переписал программу из учебника :) извините если что-то не так...)

а разве вот эта строчка:

BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);

не даёт значение 1 ?

 
concord99:


я переписал программу из учебника :) извините если что-то не так...)

а разве вот эта строчка:

BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);

не даёт значение 1 ?


Выставленный ордер получает уникальный номер, иногда семизначный.
 
Roger:

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


спасибо...попробую поставить условие > 0

 
Только непонятно, зачем Вам модификации стопов и тейков, если при пересечении МА один ордер заркрывается, а другой открывается?
 
Roger:
Только непонятно, зачем Вам модификации стопов и тейков, если при пересечении МА один ордер заркрывается, а другой открывается?

Большое спасибо! Благодаря вашему совету дело у меня сдвинулось с мёртвой точки. А советник этот - просто тест. Никакой идеи не содержит. Мне главное сейчас понять принципы программирования.

Очень благодарен Вам.

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