Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1981

 
законопослушный гражданин #:

р.с. Автора "нет наличии"

b+=a;

b=b+a;

это эквивалентные записи

 
Aleksei Stepanenko #:

это эквивалентные записи

спасибо.

 
Andrei Sokolov #:

Здравствуйте. Подскажите, пожалста, весь мозг сломал. 

Делаю один индикатор одновременно отображающий два индикатора "AMA" и два "M a" (не сток). Первые два "AMA" имеют по одному буферу, два  "M a"  по 3 буфера, INDICATOR_DATA, INDICATOR_COLOR_INDEX, INDICATOR_CALCULATIONS.

Первые собирал поочередно, сначала два  "AMA", потом добавил один  "M a", все было корректно, последний  "M a" не отображается, хотя в буфере данные есть и в окне данных есть. Думаю проблема в очередности буферов.

#property indicator_plots   4
PlotIndexSetInteger(5,PLOT_COLOR_INDEXES,20);

Уже не стыковка

 
Valeriy Yastremskiy #:

Флаги существуют булевы. У Вас условия, новый бар, флаг нет ордеров, открывается ордер по сигналу И флаг нет ордеров, флаг ставим есть ордера. На новом баре флаг ставим нет ордеров.

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

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

Может есть какой то пример, как подобное решение оформлено? я нашел одно но тоже не смог адаптировать пока.

datetime GetLastOpenTime(int type) {

 datetime tm = -1;

 int cnt = OrdersTotal();
 for (int i=0; i<cnt; i++) {
   if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

   //Опционально
   if (OrderSymbol() != Symbol()) continue;
   if (OrderMagicNumber() != Magic) continue;

   if (OrderType() != type) continue;

   tm = MathMax(tm, OrderOpenTime());
 }

 cnt = HistoryTotal();
 for (i=0; i<cnt; i++) {
   if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

   //Опционально
   if (OrderSymbol() != Symbol()) continue;
   if (OrderMagicNumber() != Magic) continue;

   if (OrderType() != type) continue;

   tm = MathMax(tm, OrderOpenTime());
 }

 return (tm);
}
 
Alexey Viktorov #:

Напрямую нет. Но я ведь не зря пытаю вас… Есть другие способы. Разве сложно ответить на прямой вопрос: Это для визуализации в тестере? Да или нет и всё. Потом я могу дать другой совет как поступить или задать ещё один вопрос для понимания что сделать лучше. Ведь не обязательно биться головой в закрытые ворота…

Alexey, прошу прощения. Я просто изначально не понял Вас. Огромное спасибо за помощь. Визуализация в тестере мне, в общем-то, не нужна. Еще раз огромное спасибо за помощь!

 
законопослушный гражданин #:

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

Может есть какой то пример, как подобное решение оформлено? я нашел одно но тоже не смог адаптировать пока.

Попробуй сделать так...должно работать

                                //---- Если есть все разрещения - открываем ордер
                                if (LotsMM > 0&&gdt_NewBarH1 != gdt_BeginBar_H1)
                                {
                                    li_Ticket = 0;
                                    ld_Price = NormalizeDouble (fGet_TradePrice (li_ind, RealTrade, gs_Symbol), Digits);
                                    ld_TP = NormalizeDouble (ld_Price + li_cmd * MathMax (gd_TP, MarketInfo (gs_Symbol, MODE_STOPLEVEL) * Point), Digits);
                                    li_Ticket = OrderSend (gs_Symbol, li_ORD, LotsMM, ld_Price, Slippage, NormalizeDouble (ld_Price - li_cmd * gd_SL, Digits), ld_TP, lsa_ord[li_ORD], gia_MG[li_MG], 0, lca_color[li_ORD]);  
                                    if (li_Ticket > 0)
                                    {
                                        gdt_NewBarH1 = gdt_BeginBar_H1;
                                        if (!gb_VirualTrade)
                                        {
                                            if (!OrderSelect (li_Ticket, SELECT_BY_TICKET)) continue;
                                            OrderPrint();
                                            ls_txt = fPrepareComment (StringConcatenate ("#", li_Ticket, "[", gia_MG[li_MG], "/", li_MG, "] ", fGet_NameOP (OrderType()), " at ", DoubleToStr (OrderOpenPrice(), Digits),
                                            "; MIN Distance = ", lda_MIN_Distance[li_MG] / Point), gb_InfoPrint);
                                            fPrintAndShowComment (ls_txt, ShowCommentInChart, PrintCom, gsa_Comment, 3);
                                            PrintStatistic = true;
                                        }
                                    }
                                    break;
                                }
 
vladeimirami #:

Alexey, прошу прощения. Я просто изначально не понял Вас. Огромное спасибо за помощь. Визуализация в тестере мне, в общем-то, не нужна. Еще раз огромное спасибо за помощь!

Тогда просто сделайте свой индикатор в котором укажите цвет во входных параметрах и в OnInit() присвойте это значение построению.

  PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, colors);

тогда цвет будет задаваться в структуре MqlParam

Ещё раз пожалуйста.

 
законопослушный гражданин #:

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

Может есть какой то пример, как подобное решение оформлено? я нашел одно но тоже не смог адаптировать пока.

Это поиск последних рыночных и исторических ордеров с нужными нам символом и магиком. К Вашей задаче это отношение не имеет. 

Про новый бар почитайте.

И если бар пока новый, то можно один раз открыть ордер.

Советники: New_Bar (условие, определяющее появление нового бара, реализованно в виде микросоветника)
Советники: New_Bar (условие, определяющее появление нового бара, реализованно в виде микросоветника)
  • 2022.06.29
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Советники: New_Bar (условие, определяющее появление нового бара, реализованно в виде микросоветника)
 
Tretyakov Rostyslav #:

Попробуй сделать так...должно работать

да! спасибо огромное! так повторные ордера не открываются.

но как же так? ведь эта функция уже есть в коде

  //---- Осуществляем проверки, способствующие оптимизации работы кода
        if (gb_Pause)
        {
            if (gb_TimePause)
            {
                if (gdt_NewBarH1 != gdt_BeginBar_H1)
                gdt_NewBarH1 = gdt_BeginBar_H1;
            }
            return;
        }

она используется для контроля "расписания торговли". Так допускается делать?

кстати, трейлинг теперь стал странно работать. Точнее то работает то нет, но вроде не критично, так как некоторые сделки закрываются по ТР а не по трейлингу. но иногда и по SL..

и еще , не могли бы словами объяснить логику работы выражения:

gdt_NewBarH1 != gdt_BeginBar_H1

как я понимаю, gdt_BeginBar_H1 возвращает время открытия текущего бара Н1, на котором идет торговля, gdt_BeginBar_H1 - это вообще что? и почему у него нет функции, его вычисляющей? 

 
законопослушный гражданин #:

да! спасибо огромное! так повторные ордера не открываются.

но как же так? ведь эта функция уже есть в коде

она используется для контроля "расписания торговли". Так допускается делать?

кстати, трейлинг теперь стал странно работать. Точнее то работает то нет, но вроде не критично, так как некоторые сделки закрываются по ТР а не по трейлингу. но иногда и по SL..

и еще , не могли бы словами объяснить логику работы выражения:

как я понимаю, gdt_BeginBar_H1 возвращает время открытия текущего бара Н1, на котором идет торговля, gdt_BeginBar_H1 - это вообще что? и почему у него нет функции, его вычисляющей? 

gdt_BeginBar_H1 это время открытия текущего бара, а gdt_NewBarH1 время открытия нового нулевого бара. При появлении нового нулевого бара время открытия нулевого бара меняется. И где то присвоение iTime есть. поиском поищите.