вопросы и ответы - страница 2

 


double f1=NormalizeDouble(iFractals(NULL,0,MODE_LOWER,3),Digits);
if(f1>0 && OrderStopLoss()<f1 && f1<Bid)

Вот условия на перенос стопа для сдеки Бай.

Попробуйсте сами написать премещения стопа. Вам сразу станет ясно, что к чему.

В справке по MQL все очень подробно разобрано.

 
serler2 >>:




Спасибо за помощь, а как можно записать значение предыдущего dn фрактала например:
double dnf=NormalizeDouble(iFractals(NULL,0,MODE_LOWER,3),Digits-[1]);
?если знаете
 
amirs >>:

Спасибо за помощь, а как можно записать значение предыдущего dn фрактала например: ?если знаете


Объявляем две переменные для фракталов, которые выше свеч и две для тех, которые ниже свеч. Затем инициализируем одну переменную и проводим сравнения. Например,

// Перед блоком инициализации объявляем переменные
double OldFraktalUp=0,FraktalUp=0,OldFraktalDown=0,FraktalDown=0;
// В блоке инициализации обнуляем их начальные значения
OldFraktalUp=0;
FraktalUp=0;
OldFraktalDown=0;
FraktalDown=0;
// В старте советника инициализируем значением и сравниваем
FraktalDown=iFractals(NULL,0,MODE_LOWER,3);// фрактал на третьей свече
if(OldFraktalDown==0 || OldFraktalDown!=FraktalDown){
// тут выполняем какие-то операции и переинициализируем переменную старого фрактала
  OldFraktalDown=FraktalDown;
}

А вообще, идея брать значение фрактала всегда на третьей свече - не лучшая идея. Лучше в цикле идти по свечкам из настоящего в прошлое, снимать показания индикатора фракталов на каждой очередной свече и как только оно станет больше нуля, прерывать цикл. Таким образом цикл всегда будет прерываться найдя ближайший к текущему времени фрактал (верхний или нижний, в зависимости от того, что нам нужно). Кроме того, в случае надобности после прерывания цикла в его счётчике будет лежать номер свечи, на которой этот фрактал найден.

К информации: индикатор фракталов, который встроен в терминал, перерисовывается. Это легко увидеть, просто кинув в тестере этот индикатор на пустого советника в режиме визуализации. Поэтому опираться на показания индикатора фракталов, который встроен в терминал - гиблое дело - прямой путь допустить ошибку и открыть ордер не по сигналу. 

 

Спасибо за участи в форуме !

я думал что

iFractals(NULL,0,MODE_LOWER,3);

3 - это третий бар, который показывает что фрактал сформировался, если 2 то фрактал сформированным не будет

А Ваши решения? как сделать в цикле?

 
double LastLowFractal;
for(int i=0;i<=Bars;i++){

   LastLowFractal=iFractals(NULL,0,MODE_LOWER,i);


  if(LastLowFractal>0){
    break;
  }
}
Не всегда последний фрактал лежит на третьем баре. Прошло ещё пару свеч и он оказался на пятом баре.
 
Например есть код
//+------------------------------------------------------------------+
//|                                                       zigzag.mq4 |
//|                                              Copyright © 2010, . |
//|                                                http://www.ru |
//+------------------------------------------------------------------+
#property copyright "Copy"
#property link      "http://www.ru"
#include <MyLib.mqh>
extern int  MaxRisk=2;
extern int  TakeProfit=30;
extern int  StopLoss=100;
extern int  ExtDepth=12;
extern int  ExtDeviation=5;
extern int  ExtBackstep=3;
datetime Today=0;
//+------------------------------------------------------------------+
int init() {return(0);}
//+------------------------------------------------------------------+
int deinit() {return(0);}
//+------------------------------------------------------------------+
int start()
{if(DayOfWeek()==0 || DayOfWeek()==6) return(0); // в выходные не работаем
 if(!IsTradeAllowed()) return(0); // пропустим тик если терминал занят
//…проверим открытие новой свечи
 if(Time[0]==Today) return(0);
 Today=Time[0];
//…получим значение ZigZag на предыдущей свече
 double lZZ=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,1); 
 // В переменную IZZ записываем значение индикатора Зиг заг на предыдущей свечке.  
//…подсчитаем количество ордеров и перенесем стоплосс
 int oBuy=0,oSell=0;
 for(int i=OrdersTotal()-1;i>=0;i--)// Цикл в котором перебираем все открытые сделки.
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // Выбираем сделку с которой собираемся работать
     {if(OrderType()==OP_BUY)// Если эта сделка Бай, для неё следующие две строчки кода.
        {double f1=NormalizeDouble(iFractals(NULL,0,MODE_LOWER,3),Digits);
        /*в переменную f1 записываем значение нижнего фрактала. 
        И это значение округляем до определенного числа после запятой. 
        (цисло знаков после запятой в константе Digits)*/
         if(f1>0 && OrderStopLoss()<f1 && f1<Bid) EditOrder(OrderTicket(),f1);}/*Если переменная f1 < больше нуля и 
      Стоп Лос выбранного ордера меньше f1 и f1 меньше цены бид, 
      тогда наверное выставляем стоп лос на уровень ф1*/
      if(OrderType()==OP_SELL)// аналогично для сделки Селл
        {double f2=NormalizeDouble(iFractals(NULL,0,MODE_UPPER,3),Digits);
         if(f2>0 && OrderStopLoss()>f2 && f2>Ask) EditOrder(OrderTicket(),f2);}
      /*Здесь и строчкой ниже идет подсчет, мколько открыто сделок на Бай, сколько на Селл. 
      И количество записывается в переменные oBuy и oSell*/
      if(OrderType()==OP_BUY) oBuy++;
      if(OrderType()==OP_SELL) oSell++;}
//…откроем ордер по показанию ZigZag при отсутствии открытых
 if(lZZ>0 && oBuy+oSell==0)
   {i=2;
    while(iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i)==0) i++;
    double fZZ=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
    double Lot=GetLot(MaxRisk);
    if(Lot==0) {Alert("Недостаточно средств!");return(0);}
    double tp=0;
    double sl=0;
    if(lZZ>fZZ)
      {sl=NormalizeDouble(lZZ+StopLoss*Point,Digits);
       if(TakeProfit>0) tp=NormalizeDouble(Bid-(sl-Bid)*TakeProfit,Digits);
       NewOrder(OP_SELL,Lot,0,tp,sl);}
    if(lZZ<fZZ)
      {sl=NormalizeDouble(lZZ-StopLoss*Point,Digits);
       if(TakeProfit>0) tp=NormalizeDouble(Ask+(Ask-sl)*TakeProfit,Digits);
       NewOrder(OP_BUY,Lot,0,tp,sl);}}
return(0);}
//+
Как вместо zigzag использовать i factals
 
Вообще, не мешало бы сначала поисправлять ошибки.

 - Отсутствует парность фигурных скобок для строки if(lZZ>0 && oBuy+oSell==0)

 - Переменная i, обявленная в шапке цикла, инициализируется значением 2 - прямой способ потерять контроль над счётчиком цикла. Далее в цикле while идёт вообще i++

 
При компиляции ошибок нет . Вообще то я новичек в этом деле. Но советник работает на тестере и довольно таки не плохо. Вот с этим i=2 я тоже не могу понять, может zigzag состоит из вверх и низ, то есть полный цикл вверх -низ, поэтому просил помочь описать каждую строку.
 
если i=2 и счетчик убрать то торговля идет в одну сторону
 
amirs >>:
При компиляции ошибок нет . Вообще то я новичек в этом деле. Но советник работает на тестере и довольно таки не плохо. Вот с этим i=2 я тоже не могу понять, может zigzag состоит из вверх и низ, то есть полный цикл вверх -низ, поэтому просил помочь описать каждую строку.


Чтоб понять что там к чему в Зиг-Заге, нужно отдавать себе отчёт в том, что такое индикаторные буферы. Ну расскажет Вам народ чего делает каждая строка кода. Толку-то? Нужен базис. Попробуйте освоить вот это - тут довольно хороший материал. По-крайней мере всё доступно описано:

Вам сюда http://www.vedikhin.ru/2006/06/get-started-with-expert-advisors.html - там вверху каждой странички есть ссылки "Предыдущий пост" и "Следующий пост" и под текстом "Продолжение". Если у Вас не будет описанного там базиса, то будут сложности.

http://www.vedikhin.ru/2006/07/first-expert.html