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

 
ruslanchik:
подскажите пожалуйста как расчитать stacksize

Конкретнее сформулируйте вопрос.
 

Можно ли пропустить в оптимизации ненужный шаг и перейти к следующему?

Пример: есть входные параметры (типа double) которые нужно оптимизировать: x1, x2, x3, x4 значения у них от 1 до 5. шаг 0.1

Понятное дело что вариантов перебора в таком случае будет 41*41*41*41=2 825 761

Но нужно осуществлять поиск в следующем ограничении: 10.5 < x1+x2+x3+x4 < 11.5 И уже здесь понятно что вариантов перебора будет многократно меньше. (а именно такое ограничение по сумме и требуется)

так вот если в код эксперта добавить это ограничение примерно так:

extern double    x1=1, x2=1, x3=1, x4=1;

int start()

{

  if (10.5<x1+x2+x3+x4 && x1+x2+x3+x4<11.5)

    {
      // основной код эксперта 

    }
  return; 

} 

то при оптимизации (при поступлении каждого нового тика) будут браться и варианты не подходящие, например x1=4, x2=4, x3=4, x4=4; что точно не будет -- так это исполнение основного кода.

То есть пока этот шаг оптимизации не "протикает" исторический интервал, переход к следующему шагу не будет. Будет "убеждение" что условие 10.5 < x1+x2+x3+x4 < 11.5 не выполняется и это лишь не даст выполнять\вычислять действия основного кода

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

Как можно исключить выполнение таких шагов в оптимизации с заведомо неподходящими под условие параметрами?

То есть когда очередной набор параметров стал неподходящим - чтоб этот шаг не оптимизировался а сразу переходил к новому ?

 
fmql:

Можно ли пропустить в оптимизации ненужный шаг и перейти к следующему?


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

или воспользоваться третьей вкладкой "Оптимзация" для самопроизвольной генерации нужного события.

 
sergeev:

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

или воспользоваться третьей вкладкой "Оптимзация" для самопроизвольной генерации нужного события.

дело в том что оптимизировать 3 параметра без участия 4-го именно в моем случае невозможно.

Здесь важен именно их совместный подбор и их сумма ограничена в интервале.

(это примерно как поиск долей всех компонентов смеси и общая масса этой смеси ограничена строгим интервалом)

Можно поподробней про третью закладку, что за такая самопроизвольная генерация нужного события ?

 

Добрый день.

Подскажите как извлечь значения свечи (Хай, Лоу, Опен, Клоуз) последнего экстремума индикатора ZigZag ?

 
Также как и для любой другой свечи. Теми же самыми функциями. ( Диаметр своей планеты думай.(с) )
 
Если же нужно получить сам номер бара последнего экстремума, то по имени объекта последнего луча получить время первой координаты, что и будет соответствовать времени бара. По времени бара определить номер бара. По номеру бара определить характеристики бара.
 
fmql:

Можно поподробней про третью закладку, что за такая самопроизвольная генерация нужного события ?


поробнее в справке

кратко - вы можете создать самостоятельно выбранные условия для пункта с третьей закладки (например открыть 10 убыточных ордеров подряд) и тестер автоматически пропустит этот прогон и перейдет к следующему.

 
Stells:

Добрый день.

Подскажите как извлечь значения свечи (Хай, Лоу, Опен, Клоуз) последнего экстремума индикатора ZigZag ?


Операция такая требует некоторых попутных вычислений.

Я когда-то делал так:

int start()
  {
 double // экстремумы Зиг-Зага
  y3=0, 
   y2=0,
    y1=0,
     y0,
     zz;   
 int    x3, x2, x1, sh=ShiftBars;// номера баров  

  y0=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, 1);

//=============================================================================
  // Берём три экстремума Зиг-Зага
   while (y3==0) 
      {
      zz=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, sh);
      if (zz!=0 && zz!=EMPTY_VALUE) 
         {
         if      (y1==0) { x1=sh; y1=zz; }
         else if (y2==0) { x2=sh; y2=zz; }
         else if (y3==0) { x3=sh; y3=zz; }
         }
      sh++;

//----- Вывод информации на экран -----------------------------------------------
string info="";
string on_off="---------------------------------------------------"+  "\r\n";

on_off=StringConcatenate (on_off,"Экстремум= ",y1," на ",x1," баре","\r\n");
on_off=StringConcatenate (on_off,"Экстремум= ",y2," на ",x2," баре","\r\n");
info=StringConcatenate(info,on_off,"\r\n");
info=StringConcatenate(info,"\r\n");
Comment(info);    

Теперь номера баров на 2-х последних экстремумах (мин и макс) вам известны и далее их хаи, лои.... найти просто!

- Close[x1], Open[x2], .... и т.п.

Возможно, кто-то предложит более простой вариант.

 
Не получается организовать цикл, X и Y всегда равны 0.
//+------------------------------------------------------------------+
//|                                                    для лавин.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern double stoploss=0; extern double takeprofit=20;extern int otstup=20; extern datetime expiration=0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
 int tiket,tikett;double volume=0.1;int i=0,R1=0,R2=0,A=1 ;double price=PRICE_OPEN;
   //  R1=((PRICE_OPEN- stoploss*Point)*stoploss)/stoploss;R2=((PRICE_OPEN+ stoploss*Point)*stoploss)/stoploss;
     
     
int start()
  {       int X,Y; double price=(Ask+Bid)/2;            
//----
       Alert ("OrdersTotal()",OrdersTotal());

if(OrderSymbol()==Symbol()&&OrderMagicNumber( )==1000){
 for(int i=OrdersTotal();i==0;i--){
OrderSelect(i,SELECT_BY_POS );if(OrderType( )==OP_BUYSTOP){X++;}}}Alert ("X", X);
if (X==0){


   tiket= OrderSend( Symbol(), OP_BUYSTOP,  volume*A, price +otstup*Point, Point* 3, R1, price+takeprofit*Point+otstup*Point, "OP_BUYSTOP", 1000,  expiration, Red); 
   Alert ("OP_BUYSTOP", GetLastError( )); }
   
if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) { 
  for( i=OrdersTotal();i==0;i--){OrderSelect(i,SELECT_BY_POS );
if(OrderType( ) ==OP_SELLSTOP) { Y++;}}}Alert ("Y", Y);
 if (Y==0){ 
   tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, price -otstup*Point, Point* 3,R2, price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );
    Alert ("OP_SELLSTOP", GetLastError( )); 
    }       
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Причина обращения: