Проблема с кодом эксперта 2 (менеджер SL)

 

Здравствуйте,

Еще раз спасибо за вашу помощь, пока я изучаю MQL.

Вот моя следующая проблема.... Я очень близок к решению этой проблемы..... Я делаю все, что хочу... Однако он изменяет SLs на КАЖДОМ тике, если GAP превышает этот критерий, а не просто ИСПОЛНЯЕТСЯ ОДИН раз...

Это очень простой код, и очень простая проблема, которую я не могу решить на данном этапе, и любая помощь помогла бы мне в обучении...

Это только сторона покупки на данный момент, однако я написал припуски для IFGAP для стороны OP_SELL на потом.


Функция этого советника состоит в том, чтобы:

1. инициировать сделку на покупку, если таковой не существует.

2. на уровне TP 1, перемещаем SL вверх.... на уровне TP 2, снова перемещаем SL вверх.... на уровне TP 3, снова перемещаем SL вверх, в последний раз. Хорошо и просто на самом деле.


Проблема новичка, с которой я сталкиваюсь, заключается в следующем:

1. Он исполняет мой OrderModify КАЖДЫЙ ТЫСЯЧУ, если превышает GAP... Я не могу придумать, как изменить логику, но как только мне покажут, я буду знать на будущее...


Заранее спасибо.

С уважением и счастливых пипсов всем.


int start()
{
    if (Bars < 10)
    {
        Comment("Not enough bars");
        return (0);
    }
    if (Terminated == true)
    {
        Comment("EA Terminated.");
        return (0);
    }
    
    OnEveryTick();
    
}

void OnEveryTick()
{
    if (DetectBrokerDigits == false && FiveDigitBroker) PipValue = 10;
    if (DetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;
    
    IfGap_Level_1();
    IfGap_Level_2();
    IfGap_Level_3();
    IfBUYOrderDoesNotExist();
    
}

void IfGap_Level_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_2 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_2*PipValue*Point))) ||
            ((Gap_Level_2 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_2*PipValue*Point)))))
            {
                BuyOrderModifyLevel_2();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_2*PipValue*Point, price + BuyTakeprofit_Level_2*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_3 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_3*PipValue*Point))) ||
            ((Gap_Level_3 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_3*PipValue*Point)))))
            {
                BuyOrderModifyLevel_3();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_3*PipValue*Point, price + BuyTakeprofit_Level_3*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfBUYOrderDoesNotExist()
{
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == InitialOrderType && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            exists = true;
        }
    }
    else
    {
        Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }
    
    if (exists == false)
    {
        Initial_BuyOrder();
        
    }
}

void Initial_BuyOrder()
{
    double SL = Ask - InitialBuyStoploss*PipValue*Point;
    if (BuyStoploss_Level_3 == 0) SL = 0;
    double TP = Ask + Initial_Takeprofit*PipValue*Point;
    if (Initial_Takeprofit == 0) TP = 0;
    int ticket = -1;
    if (true)
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, 0, 0, "My Expert", BUY_Magic, 0, Blue);
    else
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, SL, TP, "My Expert", BUY_Magic, 0, Blue);
    if (ticket > -1)
    {
        if (true)
        {
            OrderSelect(ticket, SELECT_BY_TICKET);
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
            
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
}



int deinit()
{
    if (ClearAllObjects) ObjectsDeleteAll();
    
    
}

 
Funky:

Проблема новичка, с которой я столкнулся, заключается в следующем:

1. Он выполняет мой OrderModify КАЖДЫЙ ТЫСЯЧУ, если превышает GAP... Я не могу придумать, как изменить логику, но как только мне покажут, я буду знать на будущее...

Если вы не хотите выполнять его для каждого тика, когда вы хотите его выполнить? Вы имеете в виду каждый тик, но только один раз? Для этого просто проверьте, были ли SL и TP уже скорректированы....

Еще одно замечание . . . IfGap_Level_1() просматривает все открытые ордера в поисках тех, которые соответствуют символу и магическому числу, затем проверяет, находится ли ордер в прибыли на определенную сумму и т.д. ... если да, то вызывает BuyOrderModifyLevel_1(), эта функция просматривает все открытые ордера в поисках тех, которые соответствуют символу и магическому числу и являются Buy. ... видите ли вы здесь небольшое повторение? Почему бы вам просто не передать номер билета из IfGap_Level_1() в BuyOrderModifyLevel_1()?

 
Funky:

Здравствуйте,

Еще раз спасибо за вашу помощь, пока я изучаю MQL.

Вот моя следующая проблема.... Я очень близок к решению этой проблемы..... Я делаю все, что хочу... Однако он изменяет SLs на КАЖДОМ тике, если GAP превышает этот критерий, а не просто ИСПОЛНЯЕТСЯ ОДИН раз...

Это очень простой код, и очень простая проблема, которую я не могу решить на данном этапе, и любая помощь помогла бы мне в обучении...

Это только сторона покупки на данный момент, однако я написал припуски для IFGAP для стороны OP_SELL на потом.


Функция этого советника состоит в том, чтобы:

1. инициировать сделку на покупку, если таковой не существует.

2. на уровне TP 1, переместить SL вверх.... на уровне TP 2, снова переместить SL вверх.... на уровне TP 3, снова переместить SL вверх. Все просто и понятно.


Проблема новичка, с которой я сталкиваюсь, заключается в следующем:

1. Он выполняет мой OrderModify КАЖДЫЙ ТЫСЯЧНЫЙ ТЫСЯЧНЫЙ, если он превышает GAP... Я не могу придумать, как изменить логику, но как только мне покажут, я буду знать на будущее...


Заранее спасибо.

С уважением и счастливых пипсов всем.


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

Вместо:

OrderOpenPrice() 

в вашем условии:

if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||

вы рассматривали/пробовали использовать OrderStopLoss()?

 
RaptorUK:

Если вы не хотите выполнять его для каждого тика, когда вы хотите его выполнить? Вы имеете в виду каждый тик, но только один раз? Для этого просто проверьте, были ли SL и TP уже скорректированы....

Еще один комментарий . . . IfGap_Level_1() перебирает все открытые ордера в поисках тех, которые соответствуют символу и магическому номеру, затем проверяет, находится ли ордер в прибыли на определенную сумму и т.д. ... если да, то вызывает BuyOrderModifyLevel_1(), эта функция перебирает все открытые ордера в поисках тех, которые соответствуют символу и магическому номеру и являются Buy. ... видите ли вы здесь небольшое повторение? Почему бы вам просто не передать номер билета из IfGap_Level_1() в BuyOrderModifyLevel_1()?

Здравствуйте еще раз, Раптор, еще раз спасибо за уделенное время. То, как я это изложил, действительно звучит запутанно. У меня проблемы с правильным соединением всех этих компонентов вместе, я думаю. На данный момент основная проблема заключается в том, что "он изменяет ордера на каждом тике", однако теперь, после ваших комментариев, я вижу и другие проблемы. Если я правильно понял последнюю часть ваших слов, вы имеете в виду, что код BuyOrderModify нужно вставить в IfGap_Level_1 в {} после проверки, был ли достигнут гэп, а не в собственный {}? Как в этом примере ниже?


void OverGap1_soModify()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
               {
                double price = Ask;
                if (UseAskLineorNot == false)
                {
                 price = OrderOpenPrice();
                 }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

И вы знаете, я чувствую себя как dejavue с моим другим советником в некотором смысле сейчас, когда коробка принимает форму (здесь https://forum.mql4.com/42870 - не намеренное сходство, так как это другой советник с другой целью, однако это указывает на те же области, которые мне нужно изучить, такие как включение двух функций вместе, я обещаю, что не пытался заполнить форум избыточностью)...

Поэтому могу ли я спросить, если переменная IFNEWORDEREXIST = TRUE в том же месте решит другую проблему. Я хочу, чтобы последняя открытая сделка, которая была сделана в ModeTrades, была той, которую я сравниваю с IfGap_Level_X в любое время (я полагаю, что эта часть похожа на мою другую).


Как только я исправлю эту ошибку с OrderModify, происходящую на КАЖДОМ тике, пока он застрял внутри этого {}, если это поле выше не является правильным, и разберусь с проблемой выбора последнего ордера, я столкнусь со следующей драмой, что в то время как IfGap_Level_3 удовлетворен, так же как и IfGap_Level_2, и IfGap_Level_1.

Я вроде как хочу, чтобы советник действовал как менеджер SL, и (несмотря на первоначальный единственный ордер на покупку) я собираюсь использовать его для управления несколькими сделками. Первая покупка была просто для того, чтобы я мог нормально протестировать его. Я бы хотел, чтобы этот код:

Если Pips ордера достигает IfGap_Level_1, я хочу, чтобы он перешел к BuyOrderModifyLevel_1, затем модифицировал существующие ордера и забыл эту часть кода.

Если Pips ордера достигает IfGap_Level_2, я хочу, чтобы он перешел к BuyOrderModifyLevel_2, затем модифицировал существующие ордера и забыл эту часть кода.

Если Pips ордера достигает IfGap_Level_3, я хочу, чтобы он перешел к BuyOrderModifyLevel_3, затем модифицировал существующие ордера и забыл эту часть кода.

Надеюсь, я не слишком далеко зашел, сначала все казалось простым.

Я надеялся, что смогу просто вставить "break;" или что-то подобное в конце каждого блока и обойтись без этого кода...
diostar:

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

Вместо:

в вашем условии:

Вы рассматривали/пробовали использовать OrderStopLoss()?

Спасибо, Диостар, вы слишком добры в своих комментариях. Я умею писать базовые скрипты, однако я не далек от этого уровня, и теперь объединение всего этого вместе вызывает у меня головную боль. Спасибо за поддержку, однако, форумные формулы и прочее мне понятны, но не столько грамматика/синтаксис программы.

Я считаю, что вы, возможно, правы, сокращая код до 1-2 функций, я просто не знаю, как...

Если бы у меня был опыт, я бы сделал IFGAP и MODIFY ORDER в одном блоке, как, я думаю, предлагаете и вы, и Raptor, однако на данном этапе я решил перестраховаться... Думаю, если бы я был профессионалом, я бы разместил TP в массиве или переключателе, и установил бы old TP=oldTP+TPincrement_Level, и все это в одном блоке примерно в 10 строках кода... В конечном итоге я сделаю это в самом последнем If Gap & ModifyOrder {}, чтобы SL увеличивался с программируемыми интервалами, однако первые несколько я хочу оставить для установки вручную в зависимости от рыночных условий...

Я не рассматривал возможность использования OrderStopLoss() в формуле. Думаю, поскольку я буду немного варьировать SLs для первых нескольких движений, я действительно хочу, чтобы он основывался на цене открытия ордера и пипсах, на которые он вырос с момента открытия. Я не очень хорошо объяснил советника, прошу прощения. Спасибо за ваше время, приятель, очень ценю.

 
Funky:

Здравствуйте еще раз, Raptor, еще раз спасибо за ваше время. То, как я это изложил, действительно звучит запутанно. У меня проблемы с правильным соединением всех этих компонентов вместе, я думаю. На данный момент основная проблема заключается в том, что "он изменяет ордера на каждом тике", однако теперь, после ваших комментариев, я вижу и другие проблемы. Если я правильно понял последнюю часть ваших слов, вы имеете в виду, что код BuyOrderModify нужно вставить в IfGap_Level_1 в {} после проверки, был ли достигнут гэп, а не в собственный {}? Как в этом примере ниже?

Вы можете сделать это, но это не совсем то, что я имел в виду...

Посмотрите на это, может быть, это имеет смысл...

          (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }
.
.
.


void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}

Другая вещь, которую я упомянул, касалась проверки того, был ли ордер уже изменен, посмотрев, каковы его SL и TP, другими словами, если вы уже изменили ордер на последнем тике, не делайте этого снова на этом тике... Это то, что вы хотели сделать?

 
RaptorUK:

Вы можете сделать это, но это не совсем то, что я имел в виду...

Посмотрите на это, может быть, это имеет смысл...

Другая вещь, которую я упомянул, была о проверке, был ли ордер уже изменен, посмотрев, каковы его SL и TP, другими словами, если вы уже изменили ордер на последнем тике, не делайте этого снова на этом тике ... это то, что вы хотели сделать?


Это отличный материал для моего обучения... Я не знал, что после имени функции можно поставить (OrderTicket()), круто. Так что это атрибуты номера билета моего последнего открытого заказа, круто. Это очень удобный совет для тех вещей, которыми я сейчас занимаюсь, спасибо.

(OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }

И здесь я вижу, что вы создали переменную Ticket. Я вообще-то не знал, что в этой части кода можно объявить переменную. Можно ли это сделать, потому что ей было присвоено значение в последней части выше? Я понимаю, как это может работать, тогда здесь используется номер билета последней сделки вместо моего "неконкретного" OrderTicket(). Это имеет смысл. Для меня это будет намного точнее, чем OrderSelect(i++... и т.д.).

void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}


Сейчас уже почти час ночи, так что я посмотрю завтра, спасибо вам огромное за ваше время. У меня такое чувство, что мне придется вставить эту логику в блок "If_Gap_Levels{}" вместо блока "BuyModify{}". Я не слишком ясно объяснил это, прошу прощения. Я думаю, что этот совет поможет мне проверить последний тикет на наличие GAP, а затем МОДИФИЦИРОВАТЬ ВСЕ предыдущие ордера с этим OP_BUY и BUY_Magic и т.д.

Другая вещь, которую я упомянул, была о проверке, был ли ордер уже изменен, посмотрев, каковы его SL и TP, другими словами, если вы уже изменили ордер на последнем тике, не делайте этого снова на этом тике ... это то, что вы хотели сделать?

Да, именно на этом я и застрял... Я просто не уверен, как это указать... Сделать ли мне bool-значение NeedsModifying = false, а затем преобразовать его в True, когда критерий IfGap будет выполнен? Я могу думать о логике, но не о синтаксисе, однако я узнал из ваших советов для меня в моем последнем эксперте, чтобы даже быть в состоянии предложить мое последнее предложение. Еще раз спасибо Raptor.

 
Funky:

Это отличный материал для моего обучения... Я не знал, что после имени функции можно поставить (OrderTicket()), круто. Значит, это приписывает мой билет, отвечающий критерию Gap, к этой функции BuyOrderModifyLevel_1? Это очень удобный совет для тех вещей, которыми я сейчас занимаюсь, спасибо.

И тут я вижу, что вы создали переменную Ticket. Я вообще-то не знал, что в этой части кода можно объявить переменную. Можно ли это сделать, потому что ей было присвоено значение в последней части выше? Я понимаю, как это может работать, тогда здесь используется номер билета последней сделки вместо моего "неконкретного" OrderTicket(). Это имеет смысл. Для меня это будет намного точнее, чем OrderSelect(i++... и т.д.).

Это часть определения функции ... так же, как и любая из стандартных функций, например, OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify - это функция, и вы передаете ей переменные, минимум 5 переменных, 6-я необязательна. Вы можете сделать то же самое со своими собственными функциями. . .

Пожалуйста. Ночь.

 
RaptorUK:

Это часть определения функции ... так же, как и любой из стандартных функций, например, OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify - это функция, и вы передаете ей переменные, минимум 5 переменных, 6-я необязательна. Вы можете сделать то же самое со своими собственными функциями. . .

Пожалуйста. Ночь.


Спасибо Raptor.... ах вы поймали меня, когда я редактировал последнее предложение в этом посте, как да вы были правы с тем, что я был после...

Спасибо, что снова напомнили мне об этом .doc... забавно, что я читал этот конкретный .doc на OrderMofidy так много раз... Раньше это руководство казалось мне китайским, но по мере того, как я продвигаюсь, более продвинутые советы выделяются. Сейчас я прочитаю его снова, и я готов поспорить, что эта функция, о которой вы упомянули, будет для меня ясна как день, однако спасибо, что указали мне на нее, чтобы я знал, что ее нужно искать.

-скопировано сверху, так как я неосознанно отредактировал последнюю часть, пока вы писали....

Другая вещь, которую я упомянул, была о проверке, был ли ордер уже изменен, посмотрев, каковы его SL и TP, другими словами, если вы уже изменили ордер на последнем тике, не делайте этого снова на этом тике ... это то, что вы хотели сделать?

Да, именно на этом я и застрял... Я просто не уверен, как это указать... Сделать ли мне значение bool для NeedsModifying = false, а затем преобразовать его в True, когда критерий IfGap будет выполнен? Я могу думать о логике, но не о синтаксисе, однако я узнал из ваших советов для меня в моем последнем эксперте, чтобы даже быть в состоянии предложить мое последнее предложение. Еще раз спасибо Raptor.

Спокойной ночи из Поднебесной.

 
RaptorUK:

Это часть определения функции ... как и любой стандартной функции, например, OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify - это функция, и вы передаете ей переменные, минимум 5 переменных, 6-я необязательна. Вы можете сделать то же самое со своими собственными функциями. . .

Пожалуйста. Ночь.


Привет, Раптор,

Я пошел немного дальше, используя идеи, которые вы мне показали. Я понял, что ваш код решил бы мою проблему, но тогда, когда ордера достигнут моего второго уровня TP, будет трудно управлять...

Я не знал, что я могу отказаться от OrderSelect i++ и просто выбрать свой собственный билет в этом уравнении, поэтому я попробовал это, так как это решит все мои проблемы с несколькими сделками... это сработает?

Если кто-то может подтвердить мне, что этот код будет работать, я буду очень рад... еще раз спасибо за поддержку ;)

void BuyPendingOrder_1()
{
    int expire = TimeCurrent() + 60 * 0;
    double price = NormalizeDouble(Ask, NDigits) + PriceOffset_1*PipValue*Point;
    double SL = price - BuyStoploss_1*PipValue*Point;
    if (BuyStoploss_1 == 0) SL = 0;
    double TP = price + BuyTakeprofit_1*PipValue*Point;
    if (BuyTakeprofit_1 == 0) TP = 0;
    if (0 == 0) expire = 0;
    int PendingOrderTicket_1 = OrderSend(Symbol(), OP_BUYSTOP, BuyLots_1, price, 4, SL, TP, "EA_Pending_Order1", BUY_Magic, expire, Blue);
     ///--^^^----^^^ allocate this ticket number to PendingOrderTicket_1 above
    if (PendingOrderTicket_1 == -1)
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
    
}

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1; ///--<<<----if PendingOrderTicket_1 is over Gap_Level_1, then proceed to BuyOrderMoidfyLevel_1 section etc
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1() 
{
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)  ///--<<<----select all trades of that pair and magic
    {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             ///--^^^^^^---- modify all trades of that pair and magic if it made it this far
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            
    }
    
}
 

Есть проблема с тем, что вы предлагаете....

Представьте, что ваш советник работает ... ... затем ваш MT4 прерывается по какой-либо причине, отключение питания, сбой MT4, ПК требует перезагрузки и т.д. ... ваш код не может продолжить работу с того места, где он остановился, потому что он больше не имеет правильного значения для PendingOrderTicket_1

 
RaptorUK:

Есть проблема с тем, что вы предлагаете....

Представьте, что ваш советник работает ... ... затем ваш MT4 прерывается по какой-либо причине, отключение питания, сбой MT4, ПК требует перезагрузки и т.д. ... ваш код не может продолжить с того места, где он остановился, потому что у него больше нет правильного значения для PendingOrderTicket_1.


Привет, Раптор, еще раз спасибо.

Это единственная проблема с приведенным выше кодом? Я думаю, что в худшем случае PendingOrderTicket_1 не будет изменен, и закроется на своем SL.

Все ли в порядке с тем, как я использовал функцию OrderSelect?

 if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1

Большая проблема, которая, я думаю, у меня возникнет, это то, что когда OrderTicket_1 превысит первый Gap_Level1, он все равно будет модифицировать ордер ПО КАЖДОМУ ТЫСЯЧЕЛЕТИЮ, когда этот критерий будет выполнен.

Так ли это? Если да, то исправит ли это приведенный ниже код?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void BuyOrderModifyLevel_1()
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
      {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             HasBeenExecuted = false;
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            {
            HasBeenExecuted = true;
            }
     }    
   
}


Или я должен сделать это с CheckGapLevel_1, чтобы он проверял его только один раз? И если да, то правильно ли я сделал это ниже????. Есть ли место, где я должен поставить "break"?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            HasBeenExecuted = false;
            {
            HasBeenExecuted = true;                
            BuyOrderModifyLevel_1;
               
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

Еще раз спасибо ;)

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