[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 131

 
borilunad:


Надо же как просто! М5 открыт и его верх немного саустил, а М1 под ним показывает нужные комменты.

Как говорится, утро вечера мудренее! Доброе утро!


Здесь задают вопросы, и получают ответы о программной реализации.

А комментарии можно и с листика читать ;)

 
Подскажите где ошибка - не могу найти.
уже переписал код модификации ордеров и ошибка осталась.
Подчеркиваю что ошибка не из журнала - в журнале не одной ошибки.
Ошибку я нашел в Результатах во время теста.
Пример:
Открыл позицию buy (ордер номер 1) по цене 1,4654
дальше в Результатах написано modify (ордер номер 1) цена 1,4654 и ТэйкПрофит 1,4752
дальше в Результатах написано close (ордер номер 1) цена 1,4704 и ТэйкПрофит 1,4752
Прибыль = 50.00

Пример убыточной позиции хотя должна закрыться только по ТэйкПрофит,так как СтопЛосс я не выставлял.
Открыл позицию buy (ордер номер 271) по цене 1,4820
дальше в Результатах написано modify (ордер номер 271) цена 1,4820 и ТэйкПрофит 1,4918
дальше в Результатах написано close (ордер номер 1) цена 1,4737 и ТэйкПрофит 1,4918
Прибыль = - 83.46

ТэйкПрофит везде я поставил 100

СтопЛосс не выставлял.

Как исправить не знаю.

При компиляции кода этого советник = 0 ошибок и 0 предупреждений.

Код для Модификации Ордеров я использовал этот:

//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0){
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);

  if (pp!=op || sl!=os || tp!=ot) {
    if (MathMod(OrderType(), 2)==0) cl=clModifyBuy;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(",er,") modifying order: ",Error(error_code));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
    }
  }
}
 
Забыл упомянуть что этот советник работает через таблицу Excel - файл Orders.csv которой сохранен в паке \experts\file
 
alex12:
Подскажите где ошибка - не могу найти.
уже переписал код модификации ордеров и ошибка осталась.
Подчеркиваю что ошибка не из журнала - в журнале не одной ошибки.
Ошибку я нашел в Результатах во время теста.
Пример:
Открыл позицию buy (ордер номер 1) по цене 1,4654
дальше в Результатах написано modify (ордер номер 1) цена 1,4654 и ТэйкПрофит 1,4752
дальше в Результатах написано close (ордер номер 1) цена 1,4704 и ТэйкПрофит 1,4752
Прибыль = 50.00

Пример убыточной позиции хотя должна закрыться только по ТэйкПрофит,так как СтопЛосс я не выставлял.
Открыл позицию buy (ордер номер 271) по цене 1,4820
дальше в Результатах написано modify (ордер номер 271) цена 1,4820 и ТэйкПрофит 1,4918
дальше в Результатах написано close (ордер номер 1) цена 1,4737 и ТэйкПрофит 1,4918
Прибыль = - 83.46

ТэйкПрофит везде я поставил 100

СтопЛосс не выставлял.

Как исправить не знаю.

При компиляции кода этого советник = 0 ошибок и 0 предупреждений.

Код для Модификации Ордеров я использовал этот:

когда закрытие сделок в тестере пишется в виде как у вас приведено, то это, скорее всего, результат работы функции orderclose (TP и SL ни при чем)
 

Помогите найти значения

1 Максимум дневной волатильности (дневной хай минус лой) за последние X=5 дней .

2 Средняя дневная волатильность за последние X=130 дней

3 И как эти значения можно записать в условии if чтобы Максимум дневной волатильности лежал в диапазоне от A=75 до B=150 - Средней дневной волатильности

double Dmax= 0.0; 
double DAvg= 0.0;
int a = 0; 
int d =d+1;  
while(a < 5) 
  { 
    Dmax = iHigh(Symbol(),PERIOD_D1,d)-iLow(Symbol(),PERIOD_D1,d); 
    a++; 
  } 
//Comment( "T ("+Dmax+")");

while(a < 130) 
   {  
 
DAvg += (iHigh(Symbol(),PERIOD_D1,d-1)-iLow(Symbol(),PERIOD_D1,d-1))/130; 
    a++; 
}
Comment( "T ("+DAvg+")");
 
sergeev:

1. Сначала узнаете сколько баров в окне помещается https://docs.mql4.com/ru/windows/WindowBarsPerChart

2. Потом узнаете дату первого бара https://docs.mql4.com/ru/windows/WindowFirstVisibleBar

3. Зная этот начальный бар и число баров - проходите по этим барам и определяете среди них максимум и минимум

4. профит


Вариант №2

https://docs.mql4.com/ru/windows/WindowPriceMaxтво

https://docs.mql4.com/ru/windows/WindowPriceMinВторой вариант

Огромное СПАСИБО за быстрый и развёрнутый ответ.Я сам склонялся к первому варианту,но не знал,как подсчитать количество баров в окне.Второй вариант лаконичнее.

Но как "поймать" последние max и min на предыдущем баре?Зарание СПАСИБО!

 
MK07:


Но как "поймать" последние max и min на предыдущем баре?Зарание СПАСИБО!

нужно просто запоминать достигнутый максимум и минимум на текущем баре, и когда появится новый бар и тот станет предыдущим, то вы уже максимум и минимум из запомненных переменных возьмете.

 
sergeev:

нужно просто запоминать достигнутый максимум и минимум на текущем баре, и когда появится новый бар и тот станет предыдущим, то вы уже максимум и минимум из запомненных переменных возьмете.


Но как? Много раз пытался это сделать в своих индикаторах-не получается!Допустим,переменной Z присваиваем значение max.Появляется новый бар (это можно отследить) и тут же Z присваивается новое значение, а значение (Z-1) "потеряно".Здесь,видимо,необходима какая-то проверка при присвоении Z нового значения (а не новый ли бар появился?).Уповаю на Ваш профессионализм и терпение! Спасибо за труд.
 

объявляйте переменную зет как статическую, или объявите ее в глобальной зоне.

перед присвоением ей нового значения проверяйте на новый бар, и проверяйте разность между ее значением, и текущим, и уж потом присваивайте ей новое значение.

 
smshev:
когда закрытие сделок в тестере пишется в виде как у вас приведено, то это, скорее всего, результат работы функции orderclose (TP и SL ни при чем)

Спасибо, но в коде вроде нет ошибок:

int CloseOrder(int ticket, double lots)
              {
               int err,i1;
               double price;
               OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
               if (lots<MarketInfo(Symbol(),MODE_MINLOT))lots=MarketInfo(Symbol(),MODE_MINLOT);
               while(i1<10)
                   {
                    RefreshRates();
                    if (OrderType()==0)price=Bid;
                    if (OrderType()==1)price=Ask;
                    if (OrderType()>1){OrderDelete(ticket);return(0);}
                    OrderClose(ticket,lots,NormalizeDouble(price,Digits),Slippage,Goldenrod);
                    err = GetLastError();
                    if (err == 0) break;
                    Print(WindowExpertName(),Symbol(),Error(err),"  при закрытии ордера");
                    Sleep(100);
                    i1++;
                   }
               return(0);
              }
Причина обращения: