Ответить
16.09.2012, 16:53
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
AlexeyVik, видимо это с опытом приходит. На данный момент я вот уже почти начал понимать что да как, перед тем как начать программировать. Потому и вопросы бывают не такие логичные.

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

  if (
sy=="0"sy=Symbol();
  for (
i=0i<ki++) {
    if (
OrderSelect(iSELECT_BY_POSMODE_TRADES)) {
      if ((
OrderSymbol()==sy || sy=="") && (op<|| OrderType()==op)) {
        
po=MarketInfo(OrderSymbol(), MODE_POINT);
        if (
mn<|| 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(-1pp-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(-1pp+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 видимо есть другая функция.
16.09.2012, 17:59
Регистрация: 13.03.2009 / Сообщений: 2,357
Поблагодарили 1,965 раз(а) / Репутация: 2042
Для меня читать код Кима всё-равно что читать декомпил. Мне кажется, что ты здесь чуток запутался. Восклицательный знак перед булевой переменной означает, что эта переменная false.
Поэтому эта часть кода относится только к варианту TSProfitOnly= false; или вторая часть условия. А для случая когда TSProfitOnly=true видимо есть другая функция.
! - инверсия, а не false.
У вас проблемы с логикой. Там всего лишь логическое выражение. Чё не заметили далее || - ИЛИ?
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
16.09.2012, 19:02
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
! - инверсия, а не false.
У вас проблемы с логикой. Там всего лишь логическое выражение. Чё не заметили далее || - ИЛИ?
Так с 2 сторон по сути тоже самое по логике. Если TSProfitOnly= false то траалит только в профитной зоне, ИЛИ опять вторая правая часть строки опять же означает траалить в профите.
Вроде бы нет смысла такое писать.
16.09.2012, 20:10
Регистрация: 13.03.2009 / Сообщений: 2,357
Поблагодарили 1,965 раз(а) / Репутация: 2042
Так с 2 сторон по сути тоже самое по логике. Если TSProfitOnly= false то траалит только в профитной зоне, ИЛИ опять вторая правая часть строки опять же означает траалить в профите.
Вроде бы нет смысла такое писать.
Точно с логикой плохо. А её надо подтянуть, это важно для программирования.
Попробуем так.
TSProfitOnly - тралить только в профите.
!TSProfitOnly - можно тралить и не в профите.
!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po
Конкретно получается
будем тралить если можно тралить и не в профите или уровень для трала находится в профите.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
16.09.2012, 20:13
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
! - инверсия, а не false.
У вас проблемы с логикой. Там всего лишь логическое выражение. Чё не заметили далее || - ИЛИ?
А ты видимо не внимательно читал.
Определение ! было дано для конкретного случая, для БУЛЕВОЙ ПЕРЕМЕННОЙ и дальше написано ИЛИ вторая часть условия.
17.09.2012, 09:09
Аватар для Rockvik
Rockvik Rockvik вне форума Интересующийся
Регистрация: 30.07.2011 / Адрес: Ейск / Сообщений: 7
Поблагодарили 3 раз(а) / Репутация: 4

По умолчанию Помогите с индикатором

Господа программисты как сделать так чтоб высвечивались только точки мах и min свечей одного цвета
#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
19.09.2012, 13:46
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
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 траал будет в любом случае.
19.09.2012, 14:53
Регистрация: 13.03.2009 / Сообщений: 2,357
Поблагодарили 1,965 раз(а) / Репутация: 2042
Если взять 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
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!

Последний раз редактировалось Ugar; 19.09.2012 в 15:32.
eevviill , hoz 
19.09.2012, 19:02
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Если !TSProfitOnly=true
то выражение if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po) всегда возвращает true.
То есть работает следующее условие трейлинга if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po) . Которое тралит в любом случае, в профите стоп или нет.
Если [B]!TSProfitOnly=false
По-моему, проще не извращаться, а написать нормально:
PHP код:
if (TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po)
              { if (
OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po
Тогда при: TSProfitOnly=true, будет стоп переносится только в профитной зоне, а если TSProfitOnly=false стоп может переноситься как в профитной зоне, так и не в профитной.
Есть ли смысл так путать код?
Чтобы понять такое, приходится чрезмерно напрягать мозг.
19.09.2012, 19:21
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Сегодня я всё-таки решил добавить функцию мартина к сове, которая попалась под руку. Всё работало исправно, потом я решил вынести во внешние переменные размеры лота, и начались ошибки при компиляции.
Вот что я добавил к сове:
В глобальных переменных:
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>= 0i--)
    {
      
OrderSelect(iSELECT_BY_POSMODE_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, как я и указал изначально.
19.09.2012, 19:39
Аватар для Nata_FX
Nata_FX Nata_FX на форуме Активный участник
Регистрация: 12.10.2011 / Сообщений: 50
Поблагодарили 35 раз(а) / Репутация: 36
Сегодня я всё-таки решил добавить функцию мартина к сове, которая попалась под руку. Всё работало исправно, потом я решил вынести во внешние переменные размеры лота, и начались ошибки
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"
Здесь кавычки зачем?
eevviill , hoz 
19.09.2012, 20:24
Регистрация: 13.03.2009 / Сообщений: 2,357
Поблагодарили 1,965 раз(а) / Репутация: 2042
По-моему, проще не извращаться, а написать нормально:
PHP код:
if (TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po)
              { if (
OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po
Тогда при: TSProfitOnly=true, будет стоп переносится только в профитной зоне, а если TSProfitOnly=false стоп может переноситься как в профитной зоне, так и не в профитной.
Есть ли смысл так путать код?
Чтобы понять такое, приходится чрезмерно напрягать мозг.
Опять ничё не понял. При таком выражении будет работать наоборот.
TSProfitOnly=false, будет стоп переносится только в профитной зоне, а если TSProfitOnly=true стоп может переноситься как в профитной зоне, так и не в профитной.
Для того и поставлен был ! перед переменой что бы инвертировать её.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
19.09.2012, 21:01
Аватар для krezi
krezi krezi вне форума Местный житель
Регистрация: 09.10.2011 / Сообщений: 116
Поблагодарили 174 раз(а) / Репутация: 175
  • Отправить сообщение для krezi с помощью ICQ
Опять ничё не понял. При таком выражении будет работать наоборот.
TSProfitOnly=false, будет стоп переносится только в профитной зоне, а если TSProfitOnly=true стоп может переноситься как в профитной зоне, так и не в профитной.
Для того и поставлен был ! перед переменой что бы инвертировать её.
А лучше вообще чтобы не косолапить писать так:

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

PS МТ4 баговая платформа, с привычкой читать не до конца и очень радостно когда просто TSProfitOnly || pp-OrderOpenPrice()
MQLzone.ru
19.09.2012, 21:07
Аватар для fxfxfxfx
fxfxfxfx fxfxfxfx вне форума Местный житель
Регистрация: 30.05.2012 / Сообщений: 223
Поблагодарили 209 раз(а) / Репутация: 210
Ugar подскажи это ошибка или некритично 'f0_43' - comparison expression expected
возможно сие исправить?
спасибо
20.09.2012, 06:46
Регистрация: 13.03.2009 / Сообщений: 2,357
Поблагодарили 1,965 раз(а) / Репутация: 2042
А лучше вообще чтобы не косолапить писать так:

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

PS МТ4 баговая платформа, с привычкой читать не до конца и очень радостно когда просто TSProfitOnly || pp-OrderOpenPrice()
Компилятор всё расставляет в соответствии с приоритетом. Арифметика имеет более высокий приоритет чем логика. По этому, сначала выполняются арифметические выражения, а уж потом логические.
В данном случае, компилятор не может не дочитать строку, так как в конце строки есть арифметика с большим приоритетом.
(TSProfitOnly=true) Для сравнения не хватает ещё одного знака =.
Кроме того TSProfitOnly должна быть инвертирована, тогда уж должно быть (TSProfitOnly==false)
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
20.09.2012, 08:02
Регистрация: 13.03.2009 / Сообщений: 2,357
Поблагодарили 1,965 раз(а) / Репутация: 2042
Ugar подскажи это ошибка или некритично 'f0_43' - comparison expression expected
возможно сие исправить?
спасибо
Это ошибка. Исправить возможно, но это не ко мне. Я не занимаюсь исправлением, доработкой, взломом, декомпиляцией чужих программ. Обращайтесь к автору.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
20.09.2012, 08:11
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
Ugar подскажи это ошибка или некритично 'f0_43' - comparison expression expected
возможно сие исправить?
спасибо
Ну так вставил-бы эту фразу в переводчик и всё понял-бы не задавая вопросов...
21.09.2012, 14:12
Аватар для krezi
krezi krezi вне форума Местный житель
Регистрация: 09.10.2011 / Сообщений: 116
Поблагодарили 174 раз(а) / Репутация: 175
  • Отправить сообщение для krezi с помощью ICQ
Компилятор всё расставляет в соответствии с приоритетом. Арифметика имеет более высокий приоритет чем логика. По этому, сначала выполняются арифметические выражения, а уж потом логические.
В данном случае, компилятор не может не дочитать строку, так как в конце строки есть арифметика с большим приоритетом.
(TSProfitOnly=true) Для сравнения не хватает ещё одного знака =.
Кроме того TSProfitOnly должна быть инвертирована, тогда уж должно быть (TSProfitOnly==false)
Красава, внимательно читаешь.
Только если не сталкивался с обрубками условий не надо копипаст с забора.

И при чём тут компилятор если речь о платформе
MQLzone.ru
26.09.2012, 17:28
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,031 раз(а) / Репутация: 9031
  • Отправить сообщение для eevviill с помощью Skype™

По умолчанию закрыть всё и потом не закрывать

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

PHP код:
Cl_Pr_Lo false;
REVERS=true;

if(
HtL_rev()>=Min_all_HtL_rev) {REVERS=false;Cl_Pr_Lo=true;}
... 

Последний раз редактировалось eevviill; 26.09.2012 в 17:32.
26.09.2012, 17:52
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
Василий, тут вариантов несколько, но не полная информация для правильного решения.
Можно расставить последовательность команд в определённой последовательности так чтобы сначала закрылись ордера, переключить флаг и реверс, а потом открывать ордера.
Или можно в цикле закрытия ордеров проверять наличие в OrderComment() строки REVERS.
Ответить

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 05:14. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO