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

Milord

Местный знаток
Какой код трала более правильный???

Вопрос для профи MQL4,нашел два варианта функции трала, и сразу возникло 2 вопроса:
1) какой вариант кода более правильный и почему?
2) если ваш вариант более верный напишите его тут?
ЗАРАНЕЕ СПАСИБО!
PHP:
//-----------------------------------1 вариант трала----------------------
void Traling_Stop_f()
{
  for(int i=0; i<OrdersTotal(); i++) { 
    if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue; 
    if(OrderSymbol() != Symbol()) continue;        

    if(OrderType()==OP_BUY) { 
      if(Bid-OrderOpenPrice()>TrailingStop*Point&& Bid>=OrderOpenPrice()+TrailingStopStart*Point) { 
        if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) 
          OrderModify(OrderTicket(), OrderOpenPrice(),Bid-TrailingStop*Point, OrderTakeProfit(), 0, CLR_NONE); 
      } 
    } 

    if(OrderType()==OP_SELL) { 
      if(OrderOpenPrice()-Ask>TrailingStop*Point && Ask<=OrderOpenPrice()-TrailingStopStart*Point) { 
        if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point) 
          OrderModify(OrderTicket(), OrderOpenPrice(),Ask+TrailingStop*Point, OrderTakeProfit(), 0, CLR_NONE); 
      }
    } 
  } 
  
}

PHP:
//----------------------------------------2 вариант трала---------------
void Tral() {
  
for( int i=0; i<OrdersTotal(); i++) 
  { 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
    {if(OrderSymbol()==Symbol())
      { if(OrderType() == OP_BUY&&OrderMagicNumber()==MagicNumber)
         { if ( (Bid-OrderOpenPrice( ) )>TrailingStart*Point) 
          { if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) 
            { ModifyStopLoss(Bid-TrailingStop*Point);
            
            }
           }
         }
        if (OrderType()==OP_SELL&&OrderMagicNumber()==MagicNumber)
          { if ( OrderOpenPrice( ) -Ask>TrailingStart*Point)
             {if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0)
               { ModifyStopLoss(Ask+TrailingStop*Point);
                 
                }
              }
           }
        }
      }
   }
 }
 

matro3

Почетный гражданин
В первом сразу: нет проверки на совпадение MagicNumber.

PHP:
if(BreakevenStart > 0)
   {
      //Print("Выставляем безубыток");
      if(pos.type==POSITION_TYPE_BUY)
         if((Bid - openPricePos > BreakevenStart * symb.point) && stopLossPos == 0)
            trade.PositionModify(_Symbol, openPricePos + (BreakevenProfit * symb.point), takeProfitPos);
      
      if(pos.type==POSITION_TYPE_SELL)
         if((openPricePos - Ask > BreakevenStart * symb.point) && stopLossPos == 0)
            trade.PositionModify(_Symbol, openPricePos - (BreakevenProfit * symb.point), takeProfitPos);
   }
   
if(TrailingStart > 0)
   {
      //Print("Трал позиции");
      if(pos.type==POSITION_TYPE_BUY)
         if(Bid - openPricePos > TrailingStart * symb.point)
            if((stopLossPos < Bid - (TrailingStop + TrailingStep) * symb.point) || stopLossPos == 0)
               trade.PositionModify(_Symbol, Bid - TrailingStop * symb.point, takeProfitPos);
      
      if(pos.type==POSITION_TYPE_SELL)
         if(openPricePos - Ask > TrailingStart * symb.point)
            if((stopLossPos > Ask + (TrailingStop + TrailingStep) * symb.point) || stopLossPos == 0)
               trade.PositionModify(_Symbol, Ask + TrailingStop * symb.point, takeProfitPos);
   }

Пользую такой на mql5, думаю сможешь приспособить.
 
Последнее редактирование:

Ugar

Гуру форума
Вопрос для профи MQL4,нашел два варианта функции трала, и сразу возникло 2 вопроса:
1) какой вариант кода более правильный и почему?
Для начала надо прийти к пониманию, а какой трал надо? Их ведь существует куча разных. И дело не в способе реализации кода, а в совершенно разных принципах работы трала.
 

max020780

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

eevviill

Заблокирован
помогите пожалуйста с написанием кода для подсчета ордеров суть такая есть сеточный советник и мне нужно посчитать сколько раз он открыл допустим сетку из 3 ордеров из четырех и т.д максимальное число колен заранее известно
http://forexsystemsru.com/indikatory-foreks/69427-indikatory-ot-eevviill-5.html#post596494
CountOpenPositions
 

max020780

Новичок форума
http://forexsystemsru.com/indikatory-foreks/69427-indikatory-ot-eevviill-5.html#post596494
CountOpenPositions

это немного не то нужно чтоб выводило и считало таким образом
серия из 1-го ордера = 1
серия из 2-х ордеров = 7
серия из 3-х ордеров = 4
серия из 4-х ордеров = 9
........
.........
серия из N ордеров = 3
а там считает сколько открытых ордеров и сколько отложенных
 

eevviill

Заблокирован
это немного не то нужно чтоб выводило и считало таким образом
серия из 1-го ордера = 1
серия из 2-х ордеров = 7
серия из 3-х ордеров = 4
серия из 4-х ордеров = 9
........
.........
серия из N ордеров = 3
а там считает сколько открытых ордеров и сколько отложенных
Ну открывай серии с разными меджиками.
А в функцию подсчёта отправляй нужный меджик для подсчёта.
 

max020780

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

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

AlexeyVik

Программист mql4 mql5
это немного не то нужно чтоб выводило и считало таким образом
серия из 1-го ордера = 1
серия из 2-х ордеров = 7
серия из 3-х ордеров = 4
серия из 4-х ордеров = 9
........
.........
серия из N ордеров = 3
а там считает сколько открытых ордеров и сколько отложенных

так не получится нужен более реальный способ решения я примитивно понимаю как это сделать но хотелось реализовать это грамотно
Ну а как ты на примитивном уровне понимаешь отличительные признаки серий?
У тебя что предусмотрено открытие нескольких серий на одном инструменте?
 

max020780

Новичок форума
Ну а как ты на примитивном уровне понимаешь отличительные признаки серий?
У тебя что предусмотрено открытие нескольких серий на одном инструменте?

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


PHP:
int series1=0;
int series2=0;
int series3=0;
int series4=0;
int series5=0;
int series6=0;
int series7=0;
int series8=0;
int series9=0;
int series10=0;
int series11=0;
int series12=0;
bool n_series1=true;
bool n_series2=true;
bool n_series3=true;
bool n_series4=true;
bool n_series5=true;
bool n_series6=true;
bool n_series7=true;
bool n_series8=true;
bool n_series9=true;
bool n_series10=true;
bool n_series11=true;
bool n_series12=true;


int NumberOfPosition( string sy = "", int mn=-1){
int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
         if(mn<0|| OrderMagicNumber()=magic)    kp++;
          
        }
    }
  }


void OnTick()
  {
//---
if(NumberOfPosition(Symbol(),-1)==0){n_series1=true;n_series2=true;n_series3=true;n_series4=true;n_series5=true;
n_series6=true;n_series7=true;n_series8=true;n_series9=true;n_series10=true;n_series11=true;n_series12=true;}
if(NumberOfPosition(Symbol(),-1)==1&&n_series1){series1++;n_series1=false;}
if(NumberOfPosition(Symbol(),-1)==2&&n_series2){series1--;series2++;n_series2=false;}
if(NumberOfPosition(Symbol(),-1)==3&&n_series3){series2--;series3++;n_series3=false;}
if(NumberOfPosition(Symbol(),-1)==4&&n_series4){series3--;series4++;n_series4=false;}
if(NumberOfPosition(Symbol(),-1)==5&&n_series5){series4--;series5++;n_series5=false;}
if(NumberOfPosition(Symbol(),-1)==6&&n_series6){series5--;series6++;n_series6=false;}
if(NumberOfPosition(Symbol(),-1)==7&&n_series7){series6--;series7++;n_series7=false;}
if(NumberOfPosition(Symbol(),-1)==8&&n_series8){series7--;series8++;n_series8=false;}
if(NumberOfPosition(Symbol(),-1)==9&&n_series9){series8--;series9++;n_series9=false;}
if(NumberOfPosition(Symbol(),-1)==10&&n_series10){series9--;series10++;n_series10=false;}
if(NumberOfPosition(Symbol(),-1)==11&&n_series11){series10--;series11++;n_series11=false;}
if(NumberOfPosition(Symbol(),-1)==12&&n_series12){series11--;series12++;n_series12=false;}

   
  }
 

AlexeyVik

Программист mql4 mql5
вот я набрасал как я вижу этот код но это с точки зрения программирования я так понимаю полный бред хотелось чтоб код был грамотно написан и с возможностью в него добавить отдельной переменной количество серий а не так как я в ручную прописал условие для 12 серий и вывести комментом на экран
Но в этом коде нет отличительных признаков серий. или у нас разные понимания серии?
Мне кажется результатом выполнения этого кода будет просто подсчёт количества ордеров и присвоение этого значения одной из переменных seriesN

 

max020780

Новичок форума
Но в этом коде нет отличительных признаков серий. или у нас разные понимания серии?
Мне кажется результатом выполнения этого кода будет просто подсчёт количества ордеров и присвоение этого значения одной из переменных seriesN

скорее всего разные понимания серии у нас с вами
как это там нет признаков серии?
давайте приведу еще один пример :
допустим было открыто 2 ордера (это серия ?) в одну сторону мы присвоили series2=1
потом эти 2 ордера закрылись
потом открылся 1 еще 1 мы приплюсовали к series2 еще 1 итого series2=2 открывается еще 1 ордер мы от series2 минусуем 1 а к series3 плюсуем 1(получаем серию из 3 ордеров верно ?) итого у нас получается что series2=1 и series3=1 другими словами 2 ордера одновременно у нас было открыто 1 раз и три ордера одновременно у нас было открыто тоже 1 раз и т.д
 

Milord

Местный знаток
Для начала надо прийти к пониманию, а какой трал надо? Их ведь существует куча разных. И дело не в способе реализации кода, а в совершенно разных принципах работы трала.
Трал нужен такой, который дает максимальный профит, при минимальной просадке!ИМХО!):D
а вот какой это трал из кучи известных, тут я пока не могу понять, например есть тралы на ATR,MA-машкам, простым пунктам pips и другие....
по моему выбрать нужный затруднительно, придется провести мини исследование,прогнав несколько вариантов трала,на одном советнике, как считаете???
 
Последнее редактирование:

Ugar

Гуру форума
Трал нужен такой, который дает максимальный профит, при минимальной просадке!ИМХО!):D
а вот какой это трал из кучи известных, тут я пока не могу понять, например есть тралы на ATR,MA-машкам, простым пунктам,по моему выбрать нужный затруднительно, придется провести мини исследование,прогнав несколько вариантов трала,на одном советнике, как считаете???
К каждой системе нужно свой трал. Обычно про него задумываются при разработке системы, если он там нужен. Конечно, если в голову не приходит мыслей по поводу какой лучше, тогда да, можно попробовать добавить все известные и сделать переключатель в настройках. Тогда можно будет попробовать подобрать, какой лучше подойдёт.
 

Milord

Местный знаток
Профи MQL4 - Как правильно написать код???

возник вопрос с подключением функций, 1-ну подключить кажется получилось, вызов на нее например Function_A() пишу сразу после команды Start(), но мне нужно из самой функции сделать вызов на другую функцию Function_B(), будет ли правильно,как я написал ниже:

PHP:
int Start()
{

if(..условие....) Function_A(); 

return(0);
}
//-------------------------------------
void Function_A() 
{
if(...условие......)
 {
  if(...условие...)
   { 
   if(...условие...) Function_B(); 
   }
 }
}
//--------------------------------------
void Function_B() 
{
if(...условие...) 
   
}
//--------------------end--------------
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
скорее всего разные понимания серии у нас с вами
как это там нет признаков серии?
давайте приведу еще один пример :
допустим было открыто 2 ордера (это серия ?) в одну сторону мы присвоили series2=1
потом эти 2 ордера закрылись
потом открылся 1 еще 1 мы приплюсовали к series2 еще 1 итого series2=2 открывается еще 1 ордер мы от series2 минусуем 1 а к series3 плюсуем 1(получаем серию из 3 ордеров верно ?) итого у нас получается что series2=1 и series3=1 другими словами 2 ордера одновременно у нас было открыто 1 раз и три ордера одновременно у нас было открыто тоже 1 раз и т.д
Понятно. Только не понятна цель такого подсчёта. Поэтому другого решения предложить сложно. Разве что считать максимальное количество, аналогично подсчёта еквити, на предыдущей странице. И когда серия закрывается значение в переменной, или даже в массиве с соответствующим индексом увеличивать на 1, а счётчик сбрасывать в 0.
А предусматриваются такие варианты, открыто 2 ордера, закрылся один. Потом открываются ещё 1+1... итого открыто 3
 

max020780

Новичок форума
Понятно. Только не понятна цель такого подсчёта. Поэтому другого решения предложить сложно. Разве что считать максимальное количество, аналогично подсчёта еквити, на предыдущей странице. И когда серия закрывается значение в переменной, или даже в массиве с соответствующим индексом увеличивать на 1, а счётчик сбрасывать в 0.
А предусматриваются такие варианты, открыто 2 ордера, закрылся один. Потом открываются ещё 1+1... итого открыто 3

Цель такого подсчета это настройка оптимальных параметров для моего советника

А предусматриваются такие варианты, открыто 2 ордера, закрылся один. Потом открываются ещё 1+1... итого открыто 3

нет подобных вариантов не предусматривается закрываются ордера все
 

AlexeyVik

Программист mql4 mql5
Цель такого подсчета это настройка оптимальных параметров для моего советника
Ну, не знаю. Такой анализ легко провести визуально по кривой баланса счёта в тестере. А в реал-тайме так вообще, 1 раз в день посмотреть и записать проще чем изобретать такой учёт. Это такое имхую...
 

matro3

Почетный гражданин
помогите пожалуйста с написанием кода для подсчета ордеров суть такая есть сеточный советник и мне нужно посчитать сколько раз он открыл допустим сетку из 3 ордеров из четырех и т.д максимальное число колен заранее известно

PHP:
ushort series[];
ushort series_current = 0;

void OnTick()
  {
//---
   int count = countOrders();
   if(count == 0)
      series_current = 0;
   if(series_current != count)
   {
      series_current = count;
      if(count == 1)
         series[0]++;
      if(count > 1)
      {
         series[count-1]++;
         series[count-2]--;
      }
   }
  }
 
Последнее редактирование:

max020780

Новичок форума
здесь будет верно если я напишу int count = OrdersTotal();


И подскажите пожалуйста как это в цикле правильно вывести на экран при помощи функции Comment ( ); чтоб в итоге оно выглядело таким образом
серия из 1-го ордера = 1
серия из 2-х ордеров = 7
серия из 3-х ордеров = 4
серия из 4-х ордеров = 9
........
.........
серия из N ордеров = 3
 
Верх