Это печатается в журнале во время моего цикла for, где в случае отложенного ордера Buy Stop, если 60 EMA >, чем OrderStopLoss, он закроет отложенный ордер, откроет новый с новым SL (который находится за 60EMA), настроит тейк-профит для получения вознаграждения 1:2, и изменит лоты относительно стопа в пунктах и моего профиля риска (скажем, 2%).
Итак, когда все это делается, пользовательская переменная "Current Lots", которая является "LotSize" в OrderSend работает, она отправляет размер лота, который не является правильным для сервера, чтобы получить "0.18215"? Может ли это быть проблемой, несмотря на то, что ордера все равно отправляются - этот вопрос больше связан с "может ли это быть причиной того, что я не могу вызвать "OrderType==OP_BUY"?
Вы должны исправить это, проверить размер лота тем же способом, который у вас уже есть ... вы даже можете написать отдельную функцию, чтобы сделать это на основе кода, который у вас уже есть ... например:
Хмм - да, я только что поиграл с этим. Похоже, что заказ просто отправляется, поскольку сервер в любом случае допускает только 0.00 (2 знака после запятой). Так что остальные цифры почти не имеют значения.
Ужас! Так обидно lol - застрял на этом слишком долго :(
Я не могу понять, почему это проблема, и я не могу выбрать "OP_BUY"... Я знаю, что я, вероятно, исчерпал эту тему, но любые последние удары в темноте были бы очень признательны - спасибо за помощь!!!
if (direction==0){ <<<//--Buy--// This gets called upon if all the set-up is apparent.double bsl=buy_stop_price;
double btp=buy_takeprofit_price;
LotSize = (RiskedAmount/(pips_to_bsl/pips))/10; //--// (in process of changing at the moment)if(OpenOrdersThisPair(Symbol())==0) //--//<--- No order open = then open one...
{
int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
}
if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips) //--//<<-- This will 99% of the time be true and the order above will be cancelled and looped in the "for" until the order is triggered.
{
for(int b=OrdersTotal()-1; b >=0; b--)
{
if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==true)
{
Print(" Stop loss value for the order is ", OrderStopLoss());
}
elseif(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==false)
{
Print(" OrderSelect failed error code is ",GetLastError());
}
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
if(OrderType()==OP_BUYSTOP)
if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)
//if(OpenOrdersThisPair(Symbol())==1)
{
DeleteOrder = OrderDelete(OrderTicket());
if(DeleteOrder!=TRUE)Print("Buy Delete Order Last Error = ", GetLastError());
}
if(OpenOrdersThisPair(Symbol())==0)//<<-- If there are no open orders = place a new order.
{
int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green);
if(NewBuyOrder == -1)Print("New Buy Order Last Error = ", GetLastError());
if(NewBuyOrder > 0)Print("NEW BUY ORDER:- Lots to open: ", DoubleToStr(LotSize, Digits), " Entry Price: ", DoubleToStr(buyPrice, Digits),
" Buy Stop Loss: ", DoubleToStr(bsl, Digits), " Buy Take Profit: ", DoubleToStr(btp, Digits), " Magic Number is: ", DoubleToStr(MagicNumber, Digits));
}
}
}
}
DomGilberto: Хмм - да, я только что поиграл с этим. Похоже, что заказ просто отправляется, поскольку сервер в любом случае допускает только 0.00 (2 знака после запятой). Так что остальные цифры почти не имеют значения.
Ужас! Так обидно lol - застрял на этом слишком долго :(
Я не могу понять, почему это проблема, и я не могу выбрать "OP_BUY"... Я знаю, что я, вероятно, исчерпал эту тему, но любые последние удары в темноте были бы очень признательны - спасибо за помощь!!!
Я думаю, вам нужно показать весь ваш код. . .
Я вижу здесь некоторые проблемы:
int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
}
// where are you checking the return value from the OrderSend() and reporting errors ?if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips) // where is the OrderSelect() ?
Извините за синтаксис - немного труднее увидеть все, но у них нет MQL4? Так что поместите его под C++
Нет проблем...
Когда вы это делаете...
//+--------------------------------------------------------------------------------------------------+//| Close OP_BUY Half lots @ 1:1 Function |//+--------------------------------------------------------------------------------------------------+if(OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1 && OrderType()==OP_BUY)
{
...какой ордер уже выбран? Это был отложенный ордер? Ваш OrderSelect() потерпит неудачу, если ваш OrderTicket() потерпит неудачу, если у вас уже нет выбранного ордера. Действительно ли вам вообще нужен этот код? Позже у вас есть цикл, в котором вы выбираете ордера и проверяете их символ, магический номер и тип...
Это тоже нужно исправить...
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
{
Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
}
... добавить несколько скобок. . .
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
{
Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
}
}
Хорошо - я сделал больше отпечатков, чтобы получить немного ясности о том, что делается и в какой момент. Я вставил их ниже.
Строка, где говорится "Выбор ордера для закрытия:-...", это то, что выбирается в точке "Close OP_BUY Half Lots @ 1:1 Function", о которой вы спрашивали выше. Получается, что номер тикета в этой точке выбора другой? Я удалил часть "...&& OrderType()==OP_BUY" из него, так как он, кажется, печатает остальное, когда эта часть не находится в операторе "if"... Дает ли это немного больше ясности?
"First Buy Order Placed:-" - это первая функция OrderSend, проходящая в самом начале. "Checking Buy Order:-" - это функция внутри цикла for для удаления и повторного открытия отложенного ордера, если MA > OrderStopLoss(). "NEW BUY ORDER:-" - это новый ордер, размещаемый внутри цикла for. "Order Select for closing:-..." - как уже упоминалось выше, это часть, которая выбирается для закрытия половины лотов.
Извините, если это было непонятно, поскольку я только что добавил эти части - вы не увидите этого в той ссылке на pastebin выше... просто простые функции печати :)
2013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: Current Bid: 1.35972 FirstTarget_Buy: 1.379312013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This is the price where half the lots will close.2013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: Order Lots Open = 0.182013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: Order Ticker Number = 92013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.090002013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.010002013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.010002013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: Order Select for closing:- Lots open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 92013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: NEW BUY ORDER:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 82013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: open #9 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: delete #8 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: Checking Buy Order:- Lots to open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 82013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: First Buy Order placed:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 7
Хорошо - я сделал больше отпечатков, чтобы получить немного ясности о том, что делается и в какой момент. Я вставил их ниже.
Строка, где говорится "Выбор ордера для закрытия:-...", это то, что выбирается в точке "Close OP_BUY Half Lots @ 1:1 Function", о которой вы спрашивали выше. Получается, что номер тикета в этой точке выбора другой? Я удалил часть "...&& OrderType()==OP_BUY" из него, так как он, кажется, печатает остальное, когда эта часть не находится в операторе "if"... Дает ли это немного больше ясности?
"First Buy Order Placed:-" - это первая функция OrderSend, проходящая в самом начале. "Checking Buy Order:-" - это функция внутри цикла for для удаления и повторного открытия отложенного ордера, если MA > OrderStopLoss(). "NEW BUY ORDER:-" - это новый ордер, размещаемый внутри цикла for. "Order Select for closing:-..." - как уже упоминалось выше, это часть, которая выбирается для закрытия половины лотов.
Извините, если это было непонятно, поскольку я только что добавил эти части - вы не увидите этого в той ссылке на pastebin выше... просто простые функции печати :)
Попробуйте прикрепить... это мое лучшее предположение о том, что вы пытаетесь сделать...
Потрясающе - спасибо. Это большой шаг в правильном направлении. Я думаю, потому что это внутри цикла for, он хочет закрыть половину и половину и половину @ цены... вместо того, чтобы сделать это один раз? Не только это, но кажется, что он не закрывает половину, как только цена >= до нужной мне цены выхода, вместо этого он выходит за ее пределы, а затем, когда цена качается обратно ниже до нужной мне цены выхода, он закрывается тогда - странно... Ценю ваше терпение в помощи мне! Очень благодарен за ваше время!!!
UPDATE: Также, я только что выяснил, что если я изменю свойства эксперта (extern int) перед запуском тестера стратегий, то закрытие половины вообще не работает - вещи, которые влияют на закрытие половины это "MA_PadAmount" это сколько пунктов я хочу добавить в качестве прокладки к стоп лоссу, который отслеживается в пунктах, и "OrderPrice_PadAmount", который позволяет мне указать сколько пунктов я могу добавить в качестве прокладки к цене входа ордеров....
DomGilberto: Потрясающе - спасибо. Это большой шаг в правильном направлении. Я думаю, потому что это внутри цикла for, он хочет закрыть половину и половину и половину @ цены... вместо того, чтобы сделать это один раз? Не только это, но кажется, что он не закрывает половину, как только цена >= до нужной мне цены выхода, вместо этого он выходит за ее пределы, а затем, когда цена качается обратно ниже до нужной мне цены выхода, он закрывается тогда - странно... Ценю ваше терпение в помощи мне! Очень благодарен за ваше время!!!
Это не цикл for, просто у него нет возможности узнать, что половина уже была закрыта... как вы планируете с этим справиться?
Да - я буквально только что понял это, когда удалил цикл for. Правильно ли я понимаю, что если я буду отслеживать номер OrderTicket с момента его первого выбора, как только OrderClose сделает свое дело и вернет true, тогда я смогу проверить это с помощью номера OrderTicket, так как они будут отличаться - таким образом, я прерву цикл и буду ждать, пока не придет другой новый заказ?
Не совсем уверен, как это написать, но примерно так?
Это печатается в журнале во время моего цикла for, где в случае отложенного ордера Buy Stop, если 60 EMA >, чем OrderStopLoss, он закроет отложенный ордер, откроет новый с новым SL (который находится за 60EMA), настроит тейк-профит для получения вознаграждения 1:2, и изменит лоты относительно стопа в пунктах и моего профиля риска (скажем, 2%).
Итак, когда все это делается, пользовательская переменная "Current Lots", которая является "LotSize" в OrderSend работает, она отправляет размер лота, который не является правильным для сервера, чтобы получить "0.18215"? Может ли это быть проблемой, несмотря на то, что ордера все равно отправляются - этот вопрос больше связан с "может ли это быть причиной того, что я не могу вызвать "OrderType==OP_BUY"?
Вы должны исправить это, проверить размер лота тем же способом, который у вас уже есть ... вы даже можете написать отдельную функцию, чтобы сделать это на основе кода, который у вас уже есть ... например:
Вместо использования LotSize в OrderSend() вы бы использовали ValidateLots(LotSize)
Я сомневаюсь, что это вызывает вашу проблему. ...
Ужас! Так обидно lol - застрял на этом слишком долго :(
Я не могу понять, почему это проблема, и я не могу выбрать "OP_BUY"... Я знаю, что я, вероятно, исчерпал эту тему, но любые последние удары в темноте были бы очень признательны - спасибо за помощь!!!
Хмм - да, я только что поиграл с этим. Похоже, что заказ просто отправляется, поскольку сервер в любом случае допускает только 0.00 (2 знака после запятой). Так что остальные цифры почти не имеют значения.
Ужас! Так обидно lol - застрял на этом слишком долго :(
Я не могу понять, почему это проблема, и я не могу выбрать "OP_BUY"... Я знаю, что я, вероятно, исчерпал эту тему, но любые последние удары в темноте были бы очень признательны - спасибо за помощь!!!
Я думаю, вам нужно показать весь ваш код. . .
Я вижу здесь некоторые проблемы:
-http://pastebin.com/eaY1wKbN
Извините за синтаксис - немного труднее увидеть все, но у них нет MQL4? Так что поместите его под C++
Весь код не помещается здесь? Но я разместил его на pastebin?
-http://pastebin.com/eaY1wKbN
Извините за синтаксис - немного труднее увидеть все, но у них нет MQL4? Так что поместите его под C++
Нет проблем...
Когда вы это делаете...
...какой ордер уже выбран? Это был отложенный ордер? Ваш OrderSelect() потерпит неудачу, если ваш OrderTicket() потерпит неудачу, если у вас уже нет выбранного ордера. Действительно ли вам вообще нужен этот код? Позже у вас есть цикл, в котором вы выбираете ордера и проверяете их символ, магический номер и тип...
Это тоже нужно исправить...
... добавить несколько скобок. . .
Хорошо - я сделал больше отпечатков, чтобы получить немного ясности о том, что делается и в какой момент. Я вставил их ниже.
Строка, где говорится "Выбор ордера для закрытия:-...", это то, что выбирается в точке "Close OP_BUY Half Lots @ 1:1 Function", о которой вы спрашивали выше. Получается, что номер тикета в этой точке выбора другой? Я удалил часть "...&& OrderType()==OP_BUY" из него, так как он, кажется, печатает остальное, когда эта часть не находится в операторе "if"... Дает ли это немного больше ясности?
"First Buy Order Placed:-" - это первая функция OrderSend, проходящая в самом начале.
"Checking Buy Order:-" - это функция внутри цикла for для удаления и повторного открытия отложенного ордера, если MA > OrderStopLoss().
"NEW BUY ORDER:-" - это новый ордер, размещаемый внутри цикла for.
"Order Select for closing:-..." - как уже упоминалось выше, это часть, которая выбирается для закрытия половины лотов.
Извините, если это было непонятно, поскольку я только что добавил эти части - вы не увидите этого в той ссылке на pastebin выше... просто простые функции печати :)
Хорошо - я сделал больше отпечатков, чтобы получить немного ясности о том, что делается и в какой момент. Я вставил их ниже.
Строка, где говорится "Выбор ордера для закрытия:-...", это то, что выбирается в точке "Close OP_BUY Half Lots @ 1:1 Function", о которой вы спрашивали выше. Получается, что номер тикета в этой точке выбора другой? Я удалил часть "...&& OrderType()==OP_BUY" из него, так как он, кажется, печатает остальное, когда эта часть не находится в операторе "if"... Дает ли это немного больше ясности?
"First Buy Order Placed:-" - это первая функция OrderSend, проходящая в самом начале.
"Checking Buy Order:-" - это функция внутри цикла for для удаления и повторного открытия отложенного ордера, если MA > OrderStopLoss().
"NEW BUY ORDER:-" - это новый ордер, размещаемый внутри цикла for.
"Order Select for closing:-..." - как уже упоминалось выше, это часть, которая выбирается для закрытия половины лотов.
Извините, если это было непонятно, поскольку я только что добавил эти части - вы не увидите этого в той ссылке на pastebin выше... просто простые функции печати :)
Попробуйте прикрепить... это мое лучшее предположение о том, что вы пытаетесь сделать...
Потрясающе - спасибо. Это большой шаг в правильном направлении. Я думаю, потому что это внутри цикла for, он хочет закрыть половину и половину и половину @ цены... вместо того, чтобы сделать это один раз? Не только это, но кажется, что он не закрывает половину, как только цена >= до нужной мне цены выхода, вместо этого он выходит за ее пределы, а затем, когда цена качается обратно ниже до нужной мне цены выхода, он закрывается тогда - странно... Ценю ваше терпение в помощи мне! Очень благодарен за ваше время!!!
UPDATE: Также, я только что выяснил, что если я изменю свойства эксперта (extern int) перед запуском тестера стратегий, то закрытие половины вообще не работает - вещи, которые влияют на закрытие половины это "MA_PadAmount" это сколько пунктов я хочу добавить в качестве прокладки к стоп лоссу, который отслеживается в пунктах, и "OrderPrice_PadAmount", который позволяет мне указать сколько пунктов я могу добавить в качестве прокладки к цене входа ордеров....
Потрясающе - спасибо. Это большой шаг в правильном направлении. Я думаю, потому что это внутри цикла for, он хочет закрыть половину и половину и половину @ цены... вместо того, чтобы сделать это один раз? Не только это, но кажется, что он не закрывает половину, как только цена >= до нужной мне цены выхода, вместо этого он выходит за ее пределы, а затем, когда цена качается обратно ниже до нужной мне цены выхода, он закрывается тогда - странно... Ценю ваше терпение в помощи мне! Очень благодарен за ваше время!!!
Не совсем уверен, как это написать, но примерно так?