Ответить
03.12.2014, 20:13
Аватар для Milord
Milord Milord вне форума Местный знаток
Регистрация: 26.03.2011 / Сообщений: 601
Поблагодарили 708 раз(а) / Репутация: 711

По умолчанию Какой код трала более правильный???

Вопрос для профи MQL4,нашел два варианта функции трала, и сразу возникло 2 вопроса:
1) какой вариант кода более правильный и почему?
2) если ваш вариант более верный напишите его тут?
ЗАРАНЕЕ СПАСИБО!
PHP код:
//-----------------------------------1 вариант трала----------------------
void Traling_Stop_f()
{
  for(
int i=0i<OrdersTotal(); i++) { 
    if(!(
OrderSelect(iSELECT_BY_POSMODE_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*PointOrderTakeProfit(), 0CLR_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*PointOrderTakeProfit(), 0CLR_NONE); 
      }
    } 
  } 
  

PHP код:
//----------------------------------------2 вариант трала---------------
void Tral() {
  
for( 
int i=0i<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);
                 
                }
              }
           }
        }
      }
   }
 } 
тестю советники, иногда пишу и дорабатываю их ...
ПУТЬ ДЛИННОЙ В 10000 МИЛЬ НАЧИНАЕТСЯ С 1 ШАГА (Лао Цзы)
03.12.2014, 20:20
Аватар для matro3
matro3 matro3 вне форума Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
В первом сразу: нет проверки на совпадение MagicNumber.

PHP код:
if(BreakevenStart 0)
   {
      
//Print("Выставляем безубыток");
      
if(pos.type==POSITION_TYPE_BUY)
         if((
Bid openPricePos BreakevenStart symb.point) && stopLossPos == 0)
            
trade.PositionModify(_SymbolopenPricePos + (BreakevenProfit symb.point), takeProfitPos);
      
      if(
pos.type==POSITION_TYPE_SELL)
         if((
openPricePos Ask BreakevenStart symb.point) && stopLossPos == 0)
            
trade.PositionModify(_SymbolopenPricePos - (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(_SymbolBid TrailingStop symb.pointtakeProfitPos);
      
      if(
pos.type==POSITION_TYPE_SELL)
         if(
openPricePos Ask TrailingStart symb.point)
            if((
stopLossPos Ask + (TrailingStop TrailingStep) * symb.point) || stopLossPos == 0)
               
trade.PositionModify(_SymbolAsk TrailingStop symb.pointtakeProfitPos);
   } 
Пользую такой на mql5, думаю сможешь приспособить.

Последний раз редактировалось matro3; 03.12.2014 в 20:22.
Milord 
04.12.2014, 12:08
Регистрация: 13.03.2009 / Сообщений: 2,362
Поблагодарили 1,968 раз(а) / Репутация: 2045
Вопрос для профи MQL4,нашел два варианта функции трала, и сразу возникло 2 вопроса:
1) какой вариант кода более правильный и почему?
Для начала надо прийти к пониманию, а какой трал надо? Их ведь существует куча разных. И дело не в способе реализации кода, а в совершенно разных принципах работы трала.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
Milord , sega79 
04.12.2014, 13:28
Аватар для max020780
max020780 max020780 вне форума Новичок форума
Регистрация: 22.12.2009 / Сообщений: 50
Поблагодарили 12 раз(а) / Репутация: 11
помогите пожалуйста с написанием кода для подсчета ордеров суть такая есть сеточный советник и мне нужно посчитать сколько раз он открыл допустим сетку из 3 ордеров из четырех и т.д максимальное число колен заранее известно
04.12.2014, 14:59
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,032 раз(а) / Репутация: 9032
  • Отправить сообщение для eevviill с помощью Skype™
помогите пожалуйста с написанием кода для подсчета ордеров суть такая есть сеточный советник и мне нужно посчитать сколько раз он открыл допустим сетку из 3 ордеров из четырех и т.д максимальное число колен заранее известно
http://forexsystemsru.com/indikatory-foreks/69427-indikatory-ot-eevviill-5.html#post596494
CountOpenPositions
04.12.2014, 15:11
Аватар для max020780
max020780 max020780 вне форума Новичок форума
Регистрация: 22.12.2009 / Сообщений: 50
Поблагодарили 12 раз(а) / Репутация: 11
http://forexsystemsru.com/indikatory-foreks/69427-indikatory-ot-eevviill-5.html#post596494
CountOpenPositions
это немного не то нужно чтоб выводило и считало таким образом
серия из 1-го ордера = 1
серия из 2-х ордеров = 7
серия из 3-х ордеров = 4
серия из 4-х ордеров = 9
........
.........
серия из N ордеров = 3
а там считает сколько открытых ордеров и сколько отложенных
04.12.2014, 16:56
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,032 раз(а) / Репутация: 9032
  • Отправить сообщение для eevviill с помощью Skype™
это немного не то нужно чтоб выводило и считало таким образом
серия из 1-го ордера = 1
серия из 2-х ордеров = 7
серия из 3-х ордеров = 4
серия из 4-х ордеров = 9
........
.........
серия из N ордеров = 3
а там считает сколько открытых ордеров и сколько отложенных
Ну открывай серии с разными меджиками.
А в функцию подсчёта отправляй нужный меджик для подсчёта.
04.12.2014, 17:07
Аватар для max020780
max020780 max020780 вне форума Новичок форума
Регистрация: 22.12.2009 / Сообщений: 50
Поблагодарили 12 раз(а) / Репутация: 11
Ну открывай серии с разными меджиками.
А в функцию подсчёта отправляй нужный меджик для подсчёта.
так не получится нужен более реальный способ решения я примитивно понимаю как это сделать но хотелось реализовать это грамотно
04.12.2014, 17:26
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
это немного не то нужно чтоб выводило и считало таким образом
серия из 1-го ордера = 1
серия из 2-х ордеров = 7
серия из 3-х ордеров = 4
серия из 4-х ордеров = 9
........
.........
серия из N ордеров = 3
а там считает сколько открытых ордеров и сколько отложенных
так не получится нужен более реальный способ решения я примитивно понимаю как это сделать но хотелось реализовать это грамотно
Ну а как ты на примитивном уровне понимаешь отличительные признаки серий?
У тебя что предусмотрено открытие нескольких серий на одном инструменте?
04.12.2014, 17:41
Аватар для max020780
max020780 max020780 вне форума Новичок форума
Регистрация: 22.12.2009 / Сообщений: 50
Поблагодарили 12 раз(а) / Репутация: 11
Ну а как ты на примитивном уровне понимаешь отличительные признаки серий?
У тебя что предусмотрено открытие нескольких серий на одном инструменте?
вот я набрасал как я вижу этот код но это с точки зрения программирования я так понимаю полный бред хотелось чтоб код был грамотно написан и с возможностью в него добавить отдельной переменной количество серий а не так как я в ручную прописал условие для 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 NumberOfPositionstring sy ""int mn=-1){
int ik=OrdersTotal(), kp=0;

  if (
sy=="0"sy=Symbol();
  for (
i=0i<ki++) {
    if (
OrderSelect(iSELECT_BY_POSMODE_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;}

   
  } 
04.12.2014, 17:55
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
вот я набрасал как я вижу этот код но это с точки зрения программирования я так понимаю полный бред хотелось чтоб код был грамотно написан и с возможностью в него добавить отдельной переменной количество серий а не так как я в ручную прописал условие для 12 серий и вывести комментом на экран
Но в этом коде нет отличительных признаков серий. или у нас разные понимания серии?
Мне кажется результатом выполнения этого кода будет просто подсчёт количества ордеров и присвоение этого значения одной из переменных seriesN

04.12.2014, 18:10
Аватар для max020780
max020780 max020780 вне форума Новичок форума
Регистрация: 22.12.2009 / Сообщений: 50
Поблагодарили 12 раз(а) / Репутация: 11
Но в этом коде нет отличительных признаков серий. или у нас разные понимания серии?
Мне кажется результатом выполнения этого кода будет просто подсчёт количества ордеров и присвоение этого значения одной из переменных seriesN

скорее всего разные понимания серии у нас с вами
как это там нет признаков серии?
давайте приведу еще один пример :
допустим было открыто 2 ордера (это серия ?) в одну сторону мы присвоили series2=1
потом эти 2 ордера закрылись
потом открылся 1 еще 1 мы приплюсовали к series2 еще 1 итого series2=2 открывается еще 1 ордер мы от series2 минусуем 1 а к series3 плюсуем 1(получаем серию из 3 ордеров верно ?) итого у нас получается что series2=1 и series3=1 другими словами 2 ордера одновременно у нас было открыто 1 раз и три ордера одновременно у нас было открыто тоже 1 раз и т.д
04.12.2014, 18:15
Аватар для Milord
Milord Milord вне форума Местный знаток
Регистрация: 26.03.2011 / Сообщений: 601
Поблагодарили 708 раз(а) / Репутация: 711
Для начала надо прийти к пониманию, а какой трал надо? Их ведь существует куча разных. И дело не в способе реализации кода, а в совершенно разных принципах работы трала.
Трал нужен такой, который дает максимальный профит, при минимальной просадке!ИМХО!)
а вот какой это трал из кучи известных, тут я пока не могу понять, например есть тралы на ATR,MA-машкам, простым пунктам pips и другие....
по моему выбрать нужный затруднительно, придется провести мини исследование,прогнав несколько вариантов трала,на одном советнике, как считаете???
тестю советники, иногда пишу и дорабатываю их ...
ПУТЬ ДЛИННОЙ В 10000 МИЛЬ НАЧИНАЕТСЯ С 1 ШАГА (Лао Цзы)

Последний раз редактировалось Milord; 04.12.2014 в 18:22.
04.12.2014, 18:28
Регистрация: 13.03.2009 / Сообщений: 2,362
Поблагодарили 1,968 раз(а) / Репутация: 2045
Трал нужен такой, который дает максимальный профит, при минимальной просадке!ИМХО!)
а вот какой это трал из кучи известных, тут я пока не могу понять, например есть тралы на ATR,MA-машкам, простым пунктам,по моему выбрать нужный затруднительно, придется провести мини исследование,прогнав несколько вариантов трала,на одном советнике, как считаете???
К каждой системе нужно свой трал. Обычно про него задумываются при разработке системы, если он там нужен. Конечно, если в голову не приходит мыслей по поводу какой лучше, тогда да, можно попробовать добавить все известные и сделать переключатель в настройках. Тогда можно будет попробовать подобрать, какой лучше подойдёт.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
04.12.2014, 18:41
Аватар для Milord
Milord Milord вне форума Местный знаток
Регистрация: 26.03.2011 / Сообщений: 601
Поблагодарили 708 раз(а) / Репутация: 711

По умолчанию Профи 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-------------- 
тестю советники, иногда пишу и дорабатываю их ...
ПУТЬ ДЛИННОЙ В 10000 МИЛЬ НАЧИНАЕТСЯ С 1 ШАГА (Лао Цзы)

Последний раз редактировалось Milord; 04.12.2014 в 18:43.
04.12.2014, 18:56
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
скорее всего разные понимания серии у нас с вами
как это там нет признаков серии?
давайте приведу еще один пример :
допустим было открыто 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
04.12.2014, 19:03
Аватар для max020780
max020780 max020780 вне форума Новичок форума
Регистрация: 22.12.2009 / Сообщений: 50
Поблагодарили 12 раз(а) / Репутация: 11
Понятно. Только не понятна цель такого подсчёта. Поэтому другого решения предложить сложно. Разве что считать максимальное количество, аналогично подсчёта еквити, на предыдущей странице. И когда серия закрывается значение в переменной, или даже в массиве с соответствующим индексом увеличивать на 1, а счётчик сбрасывать в 0.
А предусматриваются такие варианты, открыто 2 ордера, закрылся один. Потом открываются ещё 1+1... итого открыто 3
Цель такого подсчета это настройка оптимальных параметров для моего советника

А предусматриваются такие варианты, открыто 2 ордера, закрылся один. Потом открываются ещё 1+1... итого открыто 3
нет подобных вариантов не предусматривается закрываются ордера все
04.12.2014, 20:09
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
Цель такого подсчета это настройка оптимальных параметров для моего советника
Ну, не знаю. Такой анализ легко провести визуально по кривой баланса счёта в тестере. А в реал-тайме так вообще, 1 раз в день посмотреть и записать проще чем изобретать такой учёт. Это такое имхую...
04.12.2014, 21:04
Аватар для matro3
matro3 matro3 вне форума Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
Цитата:
помогите пожалуйста с написанием кода для подсчета ордеров суть такая есть сеточный советник и мне нужно посчитать сколько раз он открыл допустим сетку из 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]--;
      }
   }
  } 

Последний раз редактировалось matro3; 04.12.2014 в 21:10.
05.12.2014, 03:18
Аватар для max020780
max020780 max020780 вне форума Новичок форума
Регистрация: 22.12.2009 / Сообщений: 50
Поблагодарили 12 раз(а) / Репутация: 11
Цитата:
int count = countOrders();
здесь будет верно если я напишу int count = OrdersTotal();


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

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


Опции темы

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

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



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


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