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

 

Эта ссылка здесь "намного" выше меня на данном этапе, однако я вижу, как я мог бы сделать классный библиотечный файл для решения моих проблем... https://www. mql5.com/en/articles/1390. Сейчас я немного нервничаю, создавая массивы билетов, и надеюсь, что пока смогу обойтись без этого... поскольку, когда я модифицирую, это только все эти Pair и Magic и т.д..

Я все сделал правильно, пока не дошел до раздела "Изменить". Он правильно выбирает билет, а затем переходит к блоку Modify... эта часть великолепна.

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

Я надеялся, что смогу отправить его в блок модификации и заставить его модифицировать все заказы этого магического числа и символа. Поэтому я попробовал небольшой переключатель true or false.

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

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

Может ли это быть другим вариантом?

 for(int i=1; i<=OrdersTotal(); i++)
     { 
      if (OrderSelect(i-1,SELECT_BY_POS)
       executedpreviously = true;
       while(true)
         {
         modify section is ok...   
          }
        executedpreviously = false;
      }
//or would I declare this back to false elsewhere... 
//I am just not sure if it needs to run here each tick to grab the next order

Может быть, где-то пригодится continue;, return() или break;?

 

А, я увидел ошибку в одном из моих предыдущих примеров...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 

Я думаю, так и должно быть:

bool IfGap_SELLLevel_00AlreadyExe = FALSE; //(this time up in declared varibales before program start)


    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 && IfGap_SELLLevel_00AlreadyExe == FALSE)
        { 
            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);
            IfGap_SELLLevel_00AlreadyExe = TRUE;
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            break;  (EDIT: going to try this break in the morning, pls let me know if I am off track totally anyway)
         }
    }

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

Если я пропускаю его в эту секцию в одну сторону, он спамит модификацией ордеров на каждом тике с последним ордером... а если я пропускаю его в другую сторону, он прокручивает ордера правильно, но он все еще модифицирует кэш ордеров на каждом тике...

Я могу получить прокрутку ордеров назад 5,4,3,2,1 или вперед 1,2,3,4,5, но я не могу придумать, как пропустить его, чтобы модифицировать все ордера без спама.

Мне интересно, 1) нужно ли мне пропустить его один раз, чтобы изменить все ордера, которые проходят через него..., или 2) нужно ли ему проходить через него каждый раз, когда ему нужно выбрать новый ордер?

Я все еще учусь, вот и все... Если никто не может направить меня в правильном направлении, я попробую эту строку выше, с разрывом и концом и посмотрю, если это заканчивается.... это должно быть что-то простое...

 
IfGap_SELLLevel_00AlreadyExe == FALSE)  this may still compile, but truly speaking, this a "mis-spelt" boolean syntax.

Вы НЕ совершили никакой ошибки. Первый вариант - это GOOD to go...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) <--- this is GOOD to go..


Возможно, у меня был похожий случай, если я правильно все это прочитал. Я пытался создать свой собственный "модифицировать стоп/лимитные ордера по минимальному уровню MODE_STOP, если Bid/Ask сдвигается на x пунктов в сторону...".

Ваш случай похож?

 
diostar:

Вы НЕ совершили никакой ошибки. Первый вариант - это GOOD to go...


Возможно, у меня был похожий случай, если я правильно все это прочитал. Я пытался создать свой собственный "модифицировать стоп/лимитные ордера по минимальному уровню MODE_STOP, если Bid/Ask сдвигается на x пунктов в сторону...".

Похож ли ваш случай?



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

Я попробую еще раз с !... так много комбинаций, чтобы попробовать... и я вижу, я должен был использовать "false" для булевого значения вместо FALSE... да, он скомпилировался и работает нормально, но та же проблема. Возможно, я найду этот проект снова и попробую с "false". В примере 2 он не прокручивал ордера, а модифицировал каждый тик, так что я попробую еще раз с измененной переменной.

Я могу заставить его перейти к блоку модификации и повернуть ордера либо вперед, либо назад, но он модифицирует каждый тик, и если я вставляю фильтр true или false после модификации, он модифицирует только первый ордер в cache.....

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

это создает мне проблему, так как любые истинные или ложные вопросы не пропускают его...

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

как вы решили эту проблему у себя?

 
void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    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 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            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;
            OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}


Независимо от того, как я объявляю глобальные переменные...

bool IfGap_SELLLevel_00AlreadyExe;

...кажется, что он модифицирует один раз, НО только один из заказов, я предполагаю, что последний заказ с тем, как я прокручиваю заказы.

Я также убрал ret00 перед заказом билета на всякий случай...

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

Эта попытка тоже не сработала:

**sent here first from that other decision, but for Pending Order 5 instead of FirstSell 00 etc...

void SellOrderModifyLevel_05()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_TICKET))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
            if (Stoploss_Level_05 == 0) Level_05_SL = 0;
            double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
            if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
            OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}

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

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

Есть какие-нибудь указания?


EDIT: Я уже выдохся, но только что подумал об этом, однако придется попробовать позже, так как закончилось время...

void IfGap_SELLLevel_05()
{
    if (OrderSelect(SellPendingOrderTicket_05,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe)
        {
            if ((Gap_Level_05 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_05*PipValue*Point))
             || (Gap_Level_05 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_05*PipValue*Point)))
            
             {
              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_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
                       if (Stoploss_Level_05 == 0) Level_05_SL = 0;
                       double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
                       if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
                       OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       IfGap_SELLLevel_00AlreadyExe = true;
            
                      }
                }
           }
       }
    
    
}
 

имеете ли вы дело с дробной точкой?

 
diostar:

имеете ли вы дело с дробной точкой?


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

Мне просто нужно, чтобы MT4 дошел до этого блока, а потом забыл о нем..... У меня такое чувство, что это выражение будет слишком сложным для MT4, но я буду продолжать попытки...

 
Funky:


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

Мне просто нужно, чтобы MT4 дошел до этого блока, а потом забыл о нем..... У меня такое чувство, что это выражение будет слишком сложным для MT4, но я буду продолжать попытки...

Нет, я имею в виду, что вы имеете дело с 4/5 цифрами - 0.0001 или 0.00001 пункта?
 
diostar:
Нет, что я имею в виду, вы имеете дело с 4/5 цифрами - 0.0001, или 0.00001 Point?


5 цифр... Я использовал это раньше...

extern bool IsFiveDigitBroker = true;
extern bool DoDetectBrokerDigits = true;
double PipValue=1;
int NDigits = 4; 
// ----

int init()
{
    NDigits = Digits;
}

// ----
init start()

int start()
{
   OnEveryTick();
}
void OnEveryTick()
{
    if (DoDetectBrokerDigits == false && IsFiveDigitBroker) PipValue = 10;
    if (DoDetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;



    //then I go on to check the IfGaps on every tick...

    IfGap_SELLLevel_00();
    IfGap_SELLLevel_01();
    IfGap_SELLLevel_02();
    IfGap_SELLLevel_03();
    IfGap_SELLLevel_04();
    IfGap_SELLLevel_05();

 }



И я думал ранее, я мог бы попробовать превратить этот Detect Digits в мою первую библиотечную вставку, хе-хе, но один шаг за раз, я должен научиться ползать сначала, хе-хе.

Я не получаю никаких сообщений об ошибках 130 цена для закрытия или что-нибудь.... Я хотел бы, чтобы это было что-то простое, как это...

На прошлой странице у меня работал пример 1, и много других подобных примеров, я просто хотел бы позволить ему изменяться раз в тик...

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


&& (OrderStopLoss() < Stoploss_Level_00)

вместо

!IfGap_SELLLevel_00AlreadyExe

Вы знаете, вы предложили кое-что ранее Diostart, что заставило меня задуматься...

Мне интересно, не сработает ли идея с !IfGap_SELLLevel_00AlreadyExe (если она не будет захватывать все ордера и модифицировать их в одном проходе, прежде чем я заблокирую этот блок), интересно, если я использую вашу идею раньше, и поставлю там такой вопрос.... Я отпишусь, если это сработает.

Если я не на том пути, пожалуйста, дайте мне знать, будьте здоровы ;)

 
Funky:


5 цифр... Я использую это раньше...



И я подумал ранее, я мог бы попробовать превратить этот Detect Digits в мою первую библиотечную вставку, хе-хе, но один шаг за раз, я должен сначала научиться ползать, хе-хе. <-- мудрый ход. Ты ползаешь. С библиотеками, в конце концов, ты будешь ходить.

Я не получаю никаких сообщений об ошибках 130 цена для закрытия или что-нибудь.... Я хотел бы, чтобы это было что-то простое, как это...

На прошлой странице у меня работал пример 1, и множество других подобных примеров, я просто хотел бы позволить ему изменяться один раз за тик... <--- см. ниже

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


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

Изначально мои символы были 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, не модифицирован

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