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

 
Funky:

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

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

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

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

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

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

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


2. Ваш OrderSelect неправильный ( https://docs.mql4.com/trading/OrderSelect ), если вы собираетесь выбирать по номеру билета, вы должны использовать SELECT_BY_TICKET , а не SELECT_BY_POS.

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

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

Не можете ли вы посмотреть на OrderOpenPrice(), OrderStopLoss() и OrderTakeProfit() ордера и определить, был ли он уже изменен на уровень 1 2 или 3?

 
RaptorUK:

1. Это просто то, что бросилось мне в глаза, что сломает ваш код.


2. Ваш OrderSelect неправильный ( https://docs.mql4.com/trading/OrderSelect ), если вы собираетесь выбирать по номеру билета, вы должны использовать SELECT_BY_TICKET , а не SELECT_BY_POS.

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

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

Не можете ли вы посмотреть на OrderOpenPrice(), OrderStopLoss() и OrderTakeProfit() ордера и определить, был ли он уже изменен на уровень 1 2 или 3?

Спасибо, Raptor, ваше понимание было очень полезным для меня...

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

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

2. Я перейду на SELECT_BY_TICKET, а не POS, большое спасибо.

3. Я действительно хочу, чтобы GAP_Level1 вызывался только один раз, так что, возможно, я прав с тем, как я собрал все это вместе. Чтобы ответить на ваш вопрос, я пытаюсь посмотреть на билет последнего отложенного ордера, чтобы увидеть, перейдет ли он через мою отметку TradeUp. Когда это произойдет, я хочу, чтобы он перетащил все мои предыдущие ордера вверх (на этот раз выбирая по магическому числу, чтобы получить их все)... На этом этапе у меня открыт еще один отложенный ордер, и когда он достигнет уровня Gap_Level2, у меня будет блок BuyModify_Level2 с тем же кодом..... Правдоподобно???

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

 
Funky:


3. Я хочу, чтобы GAP_Level1 вызывался только один раз, поэтому, возможно, я прав в том, как я соединил все это вместе. Чтобы ответить на ваш вопрос, я пытаюсь посмотреть на билет последнего отложенного ордера, чтобы увидеть, перейдет ли он через мою отметку TradeUp. Когда это произойдет, я хочу, чтобы он перетащил все мои предыдущие ордера вверх (на этот раз выбирая по магическому числу, чтобы получить их все)... На этом этапе у меня открыт еще один отложенный ордер, и когда он достигнет уровня Gap_Level2, у меня будет блок BuyModify_Level2 с тем же кодом..... Правдоподобно???


Как (или где в вашем коде) вы установите HasBeenExecuted = false ; чтобы IfGap_Level_1() выполнялась для 2-го набора сделок?
 
RaptorUK:
Как (или где в вашем коде) вы установите HasBeenExecuted = false ; чтобы IfGap_Level_1() выполнялась для второго набора сделок?

Хороший вопрос, приятель.

Я собирался сделать bool эту переменную в начале внутренних переменных под теми, которые я экспортирую. Я собирался сделать GAP_Level_1, GAP_Level_2, GAP_Level_3, GAP_Level_4, GAP_Level_5 и т.д. Таким образом, как только он достигнет GAP_Level_1, он может забыть об этом первом уровне пробелов.

Ваше замечание заставило меня задуматься, спасибо. Теперь я действительно вижу проблему.

Я понял, что когда сделка достигает SL и начинается заново, я хочу, чтобы первая сделка снова искала Gap_Level_1 и вращалась через него. И, черт возьми, это вызовет проблему, поскольку я собирался связать PendingOrder_1 с GAP_Level_1, PendingOrderLevel_Level_2 с GAP_Level2.

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

Я могу придумать три обходных пути... Первый подходит для моего мозга немного лучше, хаха ;)

1. если я пойду по пути IF LAST TRADE IS LOSS, то удалю все отложенные ордера, и перезапущу их, если сделка достигнет SL. Таким образом, если отложенный ордер 1 дойдет до уровня Gap Level_1, то это остановит Pending_Order5 как следующую открытую сделку, которая дойдет до GAP_Level5. После достижения SL все мои открытые сделки будут закрыты, поскольку все они имеют один и тот же SL, поэтому закрытие отложенных ордеров и перезапуск логики может быть нормальным.

2. Другой вариант, о котором я могу думать (благодаря вашей подсказке с моей другой проблемой кода несколько недель назад), это вставить булеву переменную после заключения первой сделки под названием NEWTRADE, а затем иметь блок IFNEWTRADE==1, затем перейти к GAP_Level1. Это наводит меня на мысль, что я мог бы сделать IFNEWTRADE1 в блоке отложенного ордера 1, IFNEWTRADE2 в блоке отложенного ордера 2 и так далее... затем IFNEWTRADE2==1 перейти на GAP_Level2.

EDIT (после кофе): 3. Я только что подумал, что если я отсортирую ордера по времени (теперь я знаю, что можно сортировать несколько ордеров множеством способов), и присвою промежуточную переменную ORD_SELECT_NUMBER, основанную на TIME. Затем после ORD_SELECT_NUMBER == 1, перейти на GAP_Level1, затем посмотреть на следующий ORD_SELECT_NUMBER, используя эту команду ORDER_SELECT_NUMBER ++.

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

Вау, но спасибо еще раз, Raptor, помимо ЗНАНИЯ КОДИРОВАНИЯ я вижу, насколько важна хорошая ЛОГИКА, спасибо, что заставил меня задуматься.

 
Funky:

Вау, но спасибо еще раз, Raptor, наряду с КОДИРОВАНИЕМ ЗНАНИЙ я вижу, насколько важна хорошая ЛОГИКА, спасибо, что заставили меня задуматься.

Вы неправильно поняли... все программное обеспечение, независимо от того, на каком языке оно написано, C++, Perl, Pascal, Fortran, Assembler и т.д., просто решает проблемы. Если логика, лежащая в основе вашего решения, несовершенна, то не имеет значения, насколько хорошим кодером вы являетесь... решение приходит первым, код приходит позже.
 
RaptorUK:
Вы неправильно поняли... все программное обеспечение, независимо от того, на каком языке оно написано, C++, Perl, Pascal, Fortran, Assembler и т.д., просто решает проблемы. Если логика, лежащая в основе вашего решения, несовершенна, то не имеет значения, насколько хорошим кодером вы являетесь... решение приходит первым, код приходит позже.

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

Вы очень помогли мне, Raptor, и я хотел еще раз сказать вам спасибо.

Я выбрал ленивый вариант 1.

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

Еще раз спасибо, Раптор :)

 
Funky:

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

Вы очень помогли мне, Raptor, и я хотел еще раз сказать вам спасибо.

Я выбрал ленивый вариант 1.

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

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

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

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

 
diostar:

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

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



Хаха, приятель, это меня рассмешило. Я понимаю, как это может произойти.

Если честно, я нашел библиотечную вставку под названием 'OrderSendReliable.mqh'. Я собираюсь сначала закончить этот советник, а затем собирался написать, как я использовал эту библиотечную вставку в другом посте о EAcode, который я собирался сделать, так как считаю, что это может исправить ситуацию с горячим рынком.

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

Вы знаете, ваш комментарий заставил меня задуматься, он просто щелкнул. Я просто вырезаю и вставляю код между своими советниками, когда мне попадается {раздел}, который мне нравится, и связываю их (например, этот {раздел} с которым у меня были проблемы в другом посте, который я упоминал ранее). Я даже не думал сделать это библиотечной вставкой и просто ссылаться на нее... Я далек от таких вещей... Я как раз собирался начать свою первую библиотечную вставку после этого советника, чтобы посмотреть, как они работают.... возможности такие классные. Этот MQL вызывает привыкание.

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

Я очень ценю вашу поддержку, ребята, жаль, что я не могу описать словами, насколько сильно ;)

 

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

Я тоже начинал со своего первого советника, то же самое, копировать, вставлять, копировать, вставлять.....

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

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

#define PI              3.1415629
#define GOLDEN_RATIO    1.618

#import "command.ex4"
   bool     isInit();
   bool     isFractional(string ins);
   bool     isOrderLimit(int cap);
   bool     isRiskLimit(double risk);
   
   int      ioSession(int h);
   string   ioWkday(datetime d);
   double   ioOrderPriceLvl(string ins, int type, double oPrice);    
   double   ioPriceLvl(string ins,double dPrice);
   bool     ioTrailStop(string ins, int tkt, int type, double oPrice,int lvl, double stop=0);
   int      ioTotalOrd(int magic);
         
   int      opClose(string ins,int ticket,int cmd,double lLot,bool Activate.NO_BREAK_ONE=false);
   int      opOpen(string ins, int cmd, double lLot, double lPrice, double lLoss, double lProfit, string comment,int EA.Id, int lSlip=0, bool Activate.NO_BREAK_ONE=false);
   int      opModify(string ins, int ticket,int cmd,double lPrice,double lLoss,double lProfit,bool Activate.NO_BREAK_ONE=false);   
   double   opStopLvl(string ins,double p);
   double   opNorm(string ins,double price);
   double   opNormL(string ins,double d);   
   double   opPoint(string ins);
   
   double   intelLot(string market, double risk,double stop); 
   double   intelCorrel(string s1,string s2, int f, int type);   
   int      intelPriceMove(string ins, int p, int L);
   int      intelTrend(string ins, int p, int q);   
#import

надеюсь, это поможет....

 
diostar:

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

Я тоже начинал со своего первого советника, то же самое, копировать, вставлять, копировать, вставлять.....

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

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

надеюсь, это поможет....


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

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

Я мог бы показать два моих примера и показать эффекты, но мой мозг просто не хочет нажать на эту кнопку...

Пример 1:

Прокручивает предыдущие заказы точно так, как я хочу, однако изменяет их на КАЖДОМ щелчке.

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

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)))
            {
                IfGap_SELLLevel_00AlreadyExe = false;
            }
            if (IfGap_SELLLevel_00AlreadyExe == false)
            {
                IfGap_SELLLevel_00AlreadyExe = true;
                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) 
        { 
            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()));
        }
    }
    
}


Пример 2:

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

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()
{
    bool IfGap_SELLLevel_00AlreadyExe = FALSE;
    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;
            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()));
        }
    }
    
}


У меня есть еще 50 попыток, сначала я попробовал небольшую секцию IF EXECUTED 00, чтобы передать ее в IFGAP, если она не была выполнена раньше... однако мне не очень повезло вставить переключатель перед hand...... Возможно, я просто опубликую этот пример, чтобы показать этот вариант....

Пример 3:

С переключателем... он все еще имеет тот же эффект, что и пример 1. Он прокручивает заказы правильно, но все еще модифицируется при каждом нажатии...

Я вижу, что переключатель снова получает false, поэтому просто проходит через него снова... однако другие попытки не пропускают его вообще... должен ли я придерживаться этого варианта и попробовать объявить IfGap_SELLLevel_00AlreadyExe = true в другом месте, если да, то где?

void IfGap_SELLLevel_00AlreadyBlock()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES))
    {
        IfGap_SELLLevel_00AlreadyExe = false;
    }
    if (IfGap_SELLLevel_00AlreadyExe == false)
    {
        IfGap_SELLLevel_00AlreadyExe = true;
        IfGap_SELLLevel_00();  
    }
}


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) 
        { 
            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 ret = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


Так что да, я действительно пытался, ребята, прежде чем беспокоить вас всех снова.... в течение часов и часов... Я снова потерялся...

Любая помощь или подсказки будут приняты с благодарностью ;)

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