Ваши вопросы по языку MQL4

AlexeyVik

Программист mql4 mql5
AlexeyVik, видимо это с опытом приходит. На данный момент я вот уже почти начал понимать что да как, перед тем как начать программировать. Потому и вопросы бывают не такие логичные.

Я попутно смотрю на функцию Кима:
PHP:
void SimpleTrailing(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        po=MarketInfo(OrderSymbol(), MODE_POINT);
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            pp=MarketInfo(OrderSymbol(), MODE_BID);
            if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po) {
              if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po) {
                ModifyOrder(-1, pp-TStop.Buy*po, -1);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            pp=MarketInfo(OrderSymbol(), MODE_ASK);
            if (!TSProfitOnly || OrderOpenPrice()-pp>TStop.Sell*po) {
              if (OrderStopLoss()>pp+(TStop.Sell+TrailingStep-1)*po || OrderStopLoss()==0) {
                ModifyOrder(-1, pp+TStop.Sell*po, -1);
              }
            }
          }
        }
      }
    }
  }
}
Тут у меня вопрос появился.

В данном участке кода:
PHP:
if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po)
              { if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po)
!TSProfitOnly означает, что если режим траал только после достижения безубыточности т.е. это траал только в профитной зоне.
Но тут идёт вариант TSProfitOnly со знаком !, т.е. наоборот выходит, что эта функция не включена. А дальше условие, которое как-раз должно соблюдаться, чтоб TSProfitOnly было в TRUE.
Смысл в том, что получается, что переменная TSProfitOnly. А условие с этой переменной есть только для варианта FALSE, а для TRUE условия нет.
Для меня читать код Кима всё-равно что читать декомпил. Мне кажется, что ты здесь чуток запутался. Восклицательный знак перед булевой переменной означает, что эта переменная false.
Поэтому эта часть кода относится только к варианту TSProfitOnly= false; или вторая часть условия. А для случая когда TSProfitOnly=true видимо есть другая функция.
 

Ugar

Гуру форума
Для меня читать код Кима всё-равно что читать декомпил. Мне кажется, что ты здесь чуток запутался. Восклицательный знак перед булевой переменной означает, что эта переменная false.
Поэтому эта часть кода относится только к варианту TSProfitOnly= false; или вторая часть условия. А для случая когда TSProfitOnly=true видимо есть другая функция.
! - инверсия, а не false.
У вас проблемы с логикой. Там всего лишь логическое выражение. Чё не заметили далее || - ИЛИ?
 

hoz

Активный участник
! - инверсия, а не false.
У вас проблемы с логикой. Там всего лишь логическое выражение. Чё не заметили далее || - ИЛИ?

Так с 2 сторон по сути тоже самое по логике. Если TSProfitOnly= false то траалит только в профитной зоне, ИЛИ опять вторая правая часть строки опять же означает траалить в профите.
Вроде бы нет смысла такое писать.
 

Ugar

Гуру форума
Так с 2 сторон по сути тоже самое по логике. Если TSProfitOnly= false то траалит только в профитной зоне, ИЛИ опять вторая правая часть строки опять же означает траалить в профите.
Вроде бы нет смысла такое писать.
Точно с логикой плохо. А её надо подтянуть, это важно для программирования.
Попробуем так.
TSProfitOnly - тралить только в профите.
!TSProfitOnly - можно тралить и не в профите.
!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po
Конкретно получается
будем тралить если можно тралить и не в профите или уровень для трала находится в профите.
 

AlexeyVik

Программист mql4 mql5
! - инверсия, а не false.
У вас проблемы с логикой. Там всего лишь логическое выражение. Чё не заметили далее || - ИЛИ?
А ты видимо не внимательно читал.:question:
Определение ! было дано для конкретного случая, для БУЛЕВОЙ ПЕРЕМЕННОЙ и дальше написано ИЛИ вторая часть условия.
 

Rockvik

Интересующийся
Помогите с индикатором

Господа программисты как сделать так чтоб высвечивались только точки мах и min свечей одного цвета:fa:
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 DarkTurquoise
#property indicator_color2 Gold
#property indicator_color3 Red
#property indicator_color4 Green

extern color color1 = DarkTurquoise;
extern color color2 = Gold;
extern color color3 = Red;
extern color color4 = Green;
double g_ibuf_92[];
double g_ibuf_96[];
double g_ibuf_100[];
double g_ibuf_104[];
int gi_108 = 0;

int init() {
SetIndexStyle(0,DRAW_SECTION);
SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 1, color2);
SetIndexBuffer(1, g_ibuf_92);
SetIndexStyle(1,DRAW_ARROW);
SetIndexStyle(2, DRAW_HISTOGRAM, STYLE_SOLID, 3, color3);
SetIndexBuffer(2, g_ibuf_100);
SetIndexStyle(3, DRAW_HISTOGRAM, STYLE_SOLID, 3, color4);
SetIndexBuffer(3, g_ibuf_104);
SetIndexArrow(1,172);
SetIndexDrawBegin(2, 10);
SetIndexDrawBegin(3, 10);
SetIndexBuffer(0, g_ibuf_92);
SetIndexBuffer(1, g_ibuf_96);
SetIndexBuffer(2, g_ibuf_100);
SetIndexBuffer(3, g_ibuf_104);
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
return (0);
}

int deinit() {
return (0);
}

int start() {
double ld_0;
double ld_8;
double ld_16;
double ld_24;
if (Bars <= 10) return (0);
gi_108 = IndicatorCounted();
if (gi_108 < 0) return (-1);
if (gi_108 > 0) gi_108--;
for (int li_32 = Bars - gi_108 - 1; li_32 >= 0; li_32--) {
ld_0 = (g_ibuf_100[li_32 + 1] + (g_ibuf_104[li_32 + 1])) / 2.0;
ld_24 = (Open[li_32] + High[li_32] + Low[li_32] + Close[li_32]) / 4.0;
ld_8 = MathMax(High[li_32], MathMax(ld_0, ld_24));
ld_16 = MathMin(Low[li_32], MathMin(ld_0, ld_24));
if (ld_0 < ld_24) {
g_ibuf_92[li_32] = ld_16;
g_ibuf_96[li_32] = ld_8;
} else {
g_ibuf_92[li_32] = ld_8;
g_ibuf_96[li_32] = ld_16;
}
g_ibuf_100[li_32] = ld_0;
g_ibuf_104[li_32] = ld_24;
}
return (0);
}
Посмотреть вложение PipHMA.mq4
 

hoz

Активный участник
Rockvik, ты ошибся разделом. Тут задают вопросы по программированию на mql, а не дорабатывают советники и индюки.

Точно с логикой плохо. А её надо подтянуть, это важно для программирования.
Попробуем так.
TSProfitOnly - тралить только в профите.
!TSProfitOnly - можно тралить и не в профите.
!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po
Конкретно получается
будем тралить если можно тралить и не в профите или уровень для трала находится в профите.

Если взять 2 случая:
При !TSProfitOnly:
PHP:
if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po)
              { if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po)
Траалим в профитной зоне И не в профитной || Траалим только в профите, т.к. согласно второго выражения.

При TSProfitOnly
PHP:
if (TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po)
              { if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po)
Траалим только в профитной зное || Траалим только в профитной зоне.
Верно?
Так получается, что при !TSProfitOnly траал будет в любом случае.
 

Ugar

Гуру форума
Если взять 2 случая:
При !TSProfitOnly:
PHP:
if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po)
              { if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po)
Траалим в профитной зоне И не в профитной || Траалим только в профите, т.к. согласно второго выражения.
Если !TSProfitOnly=true
то выражение if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po) всегда возвращает true.
То есть работает следующее условие трейлинга if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po) . Которое тралит в любом случае, в профите стоп или нет.
Если !TSProfitOnly=false
то выражение if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po) возвращает true только когда уровень на который будет подтянут стоп находится в профите. Только в этом случае будет работать следующее условие трейлинга.

При TSProfitOnly
PHP:
if (TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po)
              { if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po)
Траалим только в профитной зное || Траалим только в профитной зоне.
Верно?
Так получается, что при !TSProfitOnly траал будет в любом случае.
Здесь всё налборот.

По сути состояние переменной TSProfitOnly включает или выключает проверку следующего условия pp-OrderOpenPrice()>TStop.Buy*po
 
Последнее редактирование:

hoz

Активный участник
Если !TSProfitOnly=true
то выражение if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po) всегда возвращает true.
То есть работает следующее условие трейлинга if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po) . Которое тралит в любом случае, в профите стоп или нет.
Если !TSProfitOnly=false


По-моему, проще не извращаться, а написать нормально:
PHP:
if (TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po)
              { if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po)
Тогда при: TSProfitOnly=true, будет стоп переносится только в профитной зоне, а если TSProfitOnly=false стоп может переноситься как в профитной зоне, так и не в профитной.
Есть ли смысл так путать код?
Чтобы понять такое, приходится чрезмерно напрягать мозг.
 

hoz

Активный участник
Сегодня я всё-таки решил добавить функцию мартина к сове, которая попалась под руку. Всё работало исправно, потом я решил вынести во внешние переменные размеры лота, и начались ошибки при компиляции.
Вот что я добавил к сове:
В глобальных переменных:
PHP:
extern double mode_1 = 0.01;
extern double mode_2 = 0.02;
extern double mode_3 = 0.04;
extern double mode_4 = 0.08;
extern double mode_5 = 0.16;
extern double mode_6 = 0.32;
double LotsArray[];
В int init():
PHP:
LotsArray[0] = "mode_1";
 LotsArray[1] = "mode_2";
 LotsArray[2] = "mode_3";
 LotsArray[3] = "mode_4";
 LotsArray[4] = "mode_5";
 LotsArray[5] = "mode_6";
Сама функция мартина:
PHP:
double Lots()
 {
   double LotM=Lot;
   int total = OrdersHistoryTotal();
   for (int i = total-1; i >= 0; i--)
    {
      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
       {
         if (OrderProfit() > 0)
          {
            LotM=LotsArray[0];
            LossCount = 0;    
          }         
          else
           {
            LotM=LotsArray[LossCount+1];
            LossCount++;
           }
       }
    }
   return(LotM);
}
При компиляции появляется ошибка:
Код:
'=' - incompatible types	C:\Program Files\FXstart - MetaTrader\experts\mmm2.1.1~.mq4 (94, 15)
Как устранить этот косяк? Ведь тип у меня double, как я и указал изначально.
 

Nata_FX

Активный участник
Сегодня я всё-таки решил добавить функцию мартина к сове, которая попалась под руку. Всё работало исправно, потом я решил вынести во внешние переменные размеры лота, и начались ошибки
PHP:
LotsArray[0] = "mode_1";
 LotsArray[1] = "mode_2";
 LotsArray[2] = "mode_3";
 LotsArray[3] = "mode_4";
 LotsArray[4] = "mode_5";
 LotsArray[5] = "mode_6";

Здесь кавычки зачем?
 

Ugar

Гуру форума
По-моему, проще не извращаться, а написать нормально:
PHP:
if (TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po)
              { if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po)
Тогда при: TSProfitOnly=true, будет стоп переносится только в профитной зоне, а если TSProfitOnly=false стоп может переноситься как в профитной зоне, так и не в профитной.
Есть ли смысл так путать код?
Чтобы понять такое, приходится чрезмерно напрягать мозг.
Опять ничё не понял. При таком выражении будет работать наоборот.
TSProfitOnly=false, будет стоп переносится только в профитной зоне, а если TSProfitOnly=true стоп может переноситься как в профитной зоне, так и не в профитной.
Для того и поставлен был ! перед переменой что бы инвертировать её.
 

krezi

Активный участник
Опять ничё не понял. При таком выражении будет работать наоборот.
TSProfitOnly=false, будет стоп переносится только в профитной зоне, а если TSProfitOnly=true стоп может переноситься как в профитной зоне, так и не в профитной.
Для того и поставлен был ! перед переменой что бы инвертировать её.

А лучше вообще чтобы не косолапить писать так:

if ((TSProfitOnly=true) || (pp-OrderOpenPrice()>(TStop.Buy*po)))

PS МТ4 баговая платформа, с привычкой читать не до конца и очень радостно когда просто TSProfitOnly || pp-OrderOpenPrice()
 

fxfxfxfx

Местный житель
Ugar подскажи это ошибка или некритично 'f0_43' - comparison expression expected
возможно сие исправить?
спасибо
 

Ugar

Гуру форума
А лучше вообще чтобы не косолапить писать так:

if ((TSProfitOnly=true) || (pp-OrderOpenPrice()>(TStop.Buy*po)))

PS МТ4 баговая платформа, с привычкой читать не до конца и очень радостно когда просто TSProfitOnly || pp-OrderOpenPrice()
Компилятор всё расставляет в соответствии с приоритетом. Арифметика имеет более высокий приоритет чем логика. По этому, сначала выполняются арифметические выражения, а уж потом логические.
В данном случае, компилятор не может не дочитать строку, так как в конце строки есть арифметика с большим приоритетом.
(TSProfitOnly=true) Для сравнения не хватает ещё одного знака =.
Кроме того TSProfitOnly должна быть инвертирована, тогда уж должно быть (TSProfitOnly==false)
 

Ugar

Гуру форума
Ugar подскажи это ошибка или некритично 'f0_43' - comparison expression expected
возможно сие исправить?
спасибо
Это ошибка. Исправить возможно, но это не ко мне. Я не занимаюсь исправлением, доработкой, взломом, декомпиляцией чужих программ. Обращайтесь к автору.
 

AlexeyVik

Программист mql4 mql5
Ugar подскажи это ошибка или некритично 'f0_43' - comparison expression expected
возможно сие исправить?
спасибо
Ну так вставил-бы эту фразу в переводчик и всё понял-бы не задавая вопросов...
 

Вложения

  • 00.jpg
    00.jpg
    26,9 КБ · Просмотры: 37

krezi

Активный участник
Компилятор всё расставляет в соответствии с приоритетом. Арифметика имеет более высокий приоритет чем логика. По этому, сначала выполняются арифметические выражения, а уж потом логические.
В данном случае, компилятор не может не дочитать строку, так как в конце строки есть арифметика с большим приоритетом.
(TSProfitOnly=true) Для сравнения не хватает ещё одного знака =.
Кроме того TSProfitOnly должна быть инвертирована, тогда уж должно быть (TSProfitOnly==false)

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

И при чём тут компилятор если речь о платформе
 

eevviill

Заблокирован
закрыть всё и потом не закрывать

Вышла вот такая проблема. Есть мультивалютный советник. Мне нужно при определённом условии выключить реверс и закрыть все ордера открытые по реверсу.
Но если так как я написал, то после отключения реверса будут закрыватся все только что открытые по тренду ордера. Что можно придумать?

PHP:
Cl_Pr_Lo = false;
REVERS=true;

if(HtL_rev()>=Min_all_HtL_rev) {REVERS=false;Cl_Pr_Lo=true;}
...
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Василий, тут вариантов несколько, но не полная информация для правильного решения.
Можно расставить последовательность команд в определённой последовательности так чтобы сначала закрылись ордера, переключить флаг и реверс, а потом открывать ордера.
Или можно в цикле закрытия ордеров проверять наличие в OrderComment() строки REVERS.
 
Верх