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); }
Почему Вы считаете, что тикет будет равен единице?
ПыСы. Если еще писать не можете, зачем усложняете программы одноразовыми функциями, приходится метаться вверх-вниз, чтобы понять что было задумано.
Почему Вы считаете, что тикет будет равен единице?
ПыСы. Если еще писать не можете, зачем усложняете программы одноразовыми функциями, приходится метаться вверх-вниз, чтобы понять что было задумано.
я переписал программу из учебника :) извините если что-то не так...)
а разве вот эта строчка:
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
не даёт значение 1 ?
я переписал программу из учебника :) извините если что-то не так...)
а разве вот эта строчка:
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
не даёт значение 1 ?
Выставленный ордер получает уникальный номер, иногда семизначный.
Выставленный ордер получает уникальный номер, иногда семизначный.
спасибо...попробую поставить условие > 0
Только непонятно, зачем Вам модификации стопов и тейков, если при пересечении МА один ордер заркрывается, а другой открывается?
Большое спасибо! Благодаря вашему совету дело у меня сдвинулось с мёртвой точки. А советник этот - просто тест. Никакой идеи не содержит. Мне главное сейчас понять принципы программирования.
Очень благодарен Вам.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день.
Я только начал изучение языка 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);
if (BuyTicket == 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
{
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);
}