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

 
diostar:

Надеюсь, это может оказать некоторую помощь.

Изначально мои символы были 4-значными, все трейлинг-стопы, стоп/лимитные ордера модифицированы, все шло как и ожидалось. Затем мой брокер решил перейти на дробные символы. Я внес необходимые изменения и увидел, что мои пипсы стали -3.4, -4.5, 0.1, 4.6, 7.3 и т.д. и т.п. Я думал, что это нормально, но на самом деле нет: Предположим, я установил лимит=7, и, скажем, последовательно происходят новые тики 1, 2, 3:

1) 7.3>лимит, затем ордер модифицируется... брокер исполняет 1 проскальзывание...

2) 7.5>лимит, затем ордер модифицируется.... брокер заполняет 0 проскальзываний...

3) 7.1>лимит, затем ордер изменяется... брокер заполняет 2 проскальзывания...

Итак, в целом, я получаю свои ордера модифицированными 3 раза для всех 3 тиков. Осознав это, я решил использовать MathRound(), чтобы округлить их до ближайшего целого числа, так что 1,2,3 становятся

1) mathround(7.3) =7 >лимит, НЕ TRUE, не модифицируется

2) mathround(7.5)=8 >limit, TRUE, порядок изменен

3) mathround(7.1)=7>limit, NOT TRUE, не модифицирован

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


Потрясающий Диостар, это очень полезная информация для меня на самом деле, особенно тот бит, который я выделил.

Итак, если я решу свою проблему, то лучшее, на что я могу надеяться:

каждый раз, когда мои условия выполняются на промежутке 00, 01, 02 и т.д., лучшее, на что я могу надеяться, это 1,2,3 (соответственно) прокрутки каждого из них. Значит, на промежутке 03 он изменит мой ордер 02,01,00, затем 01,00,02, затем 00,02,01, пока все ордера не будут изменены? Если я прокручу их вперед, будет то же самое, но другой порядок и т.д....

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

все еще собираюсь попробовать эту форумулу...

 
эта формула тоже прошла хорошо, спасибо за поддержку Diostar, я целую вечность гонялся за своим хвостом, изучая код, спасибо.
 

Как всегда, задним числом можно придумать другое решение.

Просто для моего обучения, будет ли ниже блок работал в качестве альтернативного обходного пути для моей проблемы раньше?


//---------------------------old attempt where it spammed modifies--------------------------------------
//---------------------------I got around this problem another way before-------------------------------
void ModifySellBlock()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

//-----------------------------however I am wondering now that I have fixed it------------------
//------------------------------would this of worked below?-------------------------------------

void ModifySellBlock()
{
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[30][2];
    for (int i = 0; i < orderstotal; i++)
    {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
        {
            continue;
        }
        ordticket[orders][0] = OrderOpenTime();
        ordticket[orders][1] = OrderTicket();
        orders++;
    }
    if (orders > 1)
    {
        ArrayResize(ordticket,orders);
        ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
        if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
        {
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

//--------------------------any problems with this block?----------------------------------------------
 
 
//-----------------------------however I am wondering now that I have fixed it------------------
//------------------------------would this of worked below?-------------------------------------

void ModifySellBlock()
{
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[30][2];<-----then, arrayinitialize
    
    for (int i = 0; i < orderstotal; i++)
    {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);<-----if(orderselect...

        if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
        {
            continue;
        }
        ordticket[orders][0] = OrderOpenTime();
        ordticket[orders][1] = OrderTicket();
        orders++;
    }
    if (orders > 1)<----orders >0
    {
        ArrayResize(ordticket,orders);
        ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
        if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)<---if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET)

        {
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;      
         
            can consider if(SL>0 || TP>0){
          
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}
 
diostar:


Спасибо за то, что уделили время Diostar. В то время у меня не было знаний, чтобы даже придумать эту идею. Даже сейчас я как бы переделал ее из нескольких фрагментов кода, поскольку я все еще учусь создавать ARRAYS...

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

Я ценю ваше время с вашими дополнениями, я попробую... Эй также Diostar, я думаю, что я замечаю то, что вы сказали раньше тоже, спасибо за предусмотрительность, так что я знаю, что это был не мой код..... Я действительно вижу прокрутку модификаций (* #orders у меня идет), и я действительно замечаю проскальзывание в них... я буду держать вас в курсе, если я обойду это, возможно, с вышеуказанным кодом в качестве начала, если честно, спасибо еще раз ;)

 
Funky:


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

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

Я ценю ваше время с вашими дополнениями, я попробую... Эй также Diostar, я думаю, что я замечаю то, что вы сказали раньше тоже, спасибо за предусмотрительность, так что я знаю, что это был не мой код..... Я действительно вижу прокрутку модификаций (* #orders у меня идет), и я действительно замечаю проскальзывание в них... я буду держать вас в курсе, если я обойду это, возможно, с вышеупомянутым кодом в качестве начала, если честно, спасибо еще раз ;)

Пожалуйста. Проскальзывание, как и спред, делают вне котировки исход в любой модификации цены, sl, tp. Но я всегда заказываю ordersend() с нулевым проскальзыванием. Возможно, было бы хорошо иметь 1,2 пункта, но пока все хорошо.

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