Индикаторный вопрос - страница 7

 
Речь идет об области видимости и последнем установленном значении. Все эти переменные имеют область видимости по крайней мере той функции, в которой они находятся, если они объявлены глобально, то они имеют область видимости за пределами функции. Если значение переменной меняется 3 раза в цикле, вы не сможете получить второе значение, в которое она была установлена, извне цикла, потому что к моменту выполнения кода вне цикла переменная будет установлена в третье значение.
 
Если я использую что-то вроде этого

И допустим, я объявляю val1 со сдвигом 3
и затем цикл, конечно, со сдвигом i

Если я ссылаюсь на val1 вне цикла, буду ли я говорить о val1 global или val1 looped?

Я думаю, мне интересно, должен ли я добавить отдельный глобальный фрактал для моих операторов if, таких как val3 и val4 или что-то еще

Я вроде как застрял здесь, но похоже, что схема ABCD по крайней мере делает небольшой прогресс

В общем, вот код, есть идеи?

//+------------------------------------------------------------------+
//|                                                  Agent86_5min.mq4 |
//|                                                    Unfinished POS |
//|                      my attempt at an ABCD scheme and fib retrace | 
//+------------------------------------------------------------------+
#property copyright "Unfinished POS by Agent86"


//---- input parameters
extern double    TakeProfit=20.0;
extern double    Lots=0.1;
extern double    StopLoss=10.0;
extern int MagicNumber=123486;

double val1;
double val2;


//++++ These are adjusted for 5 digit brokers.

int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)

    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   if (Digits == 5 || Digits == 3)
   {    // Adjust for five (5) digit brokers.
      pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
   } 
   else 
    {    
      pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; 
    }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
     
   
    
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
   
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   
        
   int i=0;                
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 
  


for(i=0; val1==0 || val2==0; i++)
     {
     if(iFractals(NULL, 0, MODE_UPPER,i) > 0 && val1 == 0) 
     val1 = iFractals(NULL, 0, MODE_UPPER, i);
     if(iFractals(NULL, 0, MODE_LOWER, i) > 0 && val2 == 0)
     val2 = iFractals(NULL, 0, MODE_LOWER, i);
     double A = val2;
     if(A !=0) 
     Print (A, " A loop down");
     double a = val1;
     if(a !=0)
     Print (a, " a loop up");
      
     //Print (" Last UPPER Fractal at ", val1, " Last LOWER Fractal at ", val2);
         
     }   
                            
      if(val1 > 0)
         {
         //Print (val1, " val1");
         //Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val1 time");      
         //datetime b = Time[3];
         ////Print (A, " A if");
         double Z=(val1-A)/2; //my attempt at a .50 retrace in pips but can be any fib level
         double C=A+Z; //using the calc above to get the retrace value at .50
         //Print (C, " C");
         if(Bid<=C && Bid > A) //C will be somewhere in between here
         Print (Low[0], " Low [0] ", C, " = C");
         // some other signal here to trade at retrace
         }        
         
         

      if(val2 < 0)
         {
         //Print (val2, " val2");
         //Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val2 time");
         //datetime c = Time[3];
         //Print(a, " a");
         double z=(a-val2)/2; //my attempt at a .50 retrace in pips but can be any fib level
         double c=a+z; //using the calc above to get the retrace value at .50
         //Print (c, " c");
         if(Bid<=c && c < a) //c will be somewhere in between here
         Print (Low[0], " Low [0] ", c, " = c");
         //some other signal here to trade at retrace
         }
         
                   
                
   return(0);
  }    

//+------------------------------------------------------------------+


Итак, A будет предыдущим минимумом, а val1 должен быть текущим сдвигом 3, и то же самое с a и val2

Мне нужно еще раз проверить, что A и a относятся к правильным значениям, потому что я добавил операторы !=0, чтобы не выводить пустые значения.
На первый взгляд, все в порядке, но мне нужно еще раз подтвердить это

Как бы то ни было, переформулируем это:
Является ли val1 в моем if(statement) правильной ссылкой на правильное условие или мне нужен совершенно другой iFractal для ссылки на сдвиг 3
Я не могу сказать, работает ли это правильно или нет, кажется, что работает, но что-то кажется неправильным, и я не могу указать на это.

Пожалуйста, посоветуйте.

Спасибо

Хотя это действительно больше не тема индикатора, я должен переместить это в новую тему?

 
Agent86:
Если я использую что-то вроде этого

И допустим, я объявляю val1 со сдвигом 3
а затем в цикле, конечно, со сдвигом i.

Если я обращусь к val1 вне цикла, буду ли я говорить о val1 глобальном или val1 зацикленном?

Наверное, мне интересно, должен ли я добавить отдельный глобальный фрактал для моих операторов if, таких как val3 и val4, или что-то еще.

val1 и val2 объявлены в глобальной области видимости, i объявлен локально в start().

val1 и val2 внутри или вне цикла имеют последнее значение, которое им было присвоено ... это происходит до цикла, а затем значения могут быть изменены внутри цикла ... после выхода из цикла значения становятся теми, какие они есть, и остаются такими до следующего вызова start(), затем они сбрасываются и, возможно, изменяются в цикле ... и т.д. и т.п.

 
RaptorUK:

val1 и val2 объявлены в глобальной области видимости, i объявлено локально в start().

val1 и val2 внутри или вне цикла имеют последнее значение, которое им было присвоено ... это происходит до цикла, а затем значения могут быть изменены внутри цикла ... после выхода из цикла значения являются теми, какие они есть, и остаются такими до следующего вызова start(), затем они сбрасываются и затем, возможно, изменяются в цикле ... и т.д. и т.п.

Хммм, так что решения решениями.

Я мог бы попробовать пойти за значениями, находясь в цикле, и просто заново объявить val1 и val2 =iFractal,,,3 снова. Чтобы сбросить все, но только после того, как я объявлю A=val2 и a=val1, чтобы у меня было значение для них, которое, надеюсь, будет моим предыдущим фракталом, если я все правильно понял.

Или я могу заново объявить val 1 и val2 вне цикла, но я не хочу потерять значение для A или a, так что я просто должен сделать это в нужное время, я думаю.

Возможно, я делаю все это неправильно, но неважно. Нужно с чего-то начинать, поэтому я выбрал этот вариант на данный момент; и я смогу его скорректировать по мере накопления опыта.

Спасибо за помощь
 
Значит, они вроде как не имеют значения?

val1=iFractals(NULL, 0, MODE_UPPER,3);
val2=iFractals(NULL, 0, MODE_LOWER,3);

 

Я предполагаю, что мне, вероятно, следует изменить их на val3 и val4, чтобы использовать фактический iFractal для торговли и только ссылаться и использовать (A) и (a) для ссылки на мой предыдущий фрактал.


Я буду продолжать работать над этим.

Спасибо

 
Хорошо

После нескольких дней размышлений и попыток проработать логику, я думаю, что у меня есть лучший рабочий код, хотя и не идеальный, но прогресс налицо.

//+------------------------------------------------------------------+
//|                                                  Agent86_5min.mq4 |
//|                                              Unfinished POS slate |
//|                                           See progress notes below |
//+------------------------------------------------------------------+
#property copyright "Unfinished POS slate by Agent86"


//---- input parameters
extern double    TakeProfit=20.0;
extern double    Lots=0.1;
extern double    StopLoss=10.0;
extern int MagicNumber=123486;

double val1;
double val2;
bool traded = false;

//++++ These are adjusted for 5 digit brokers.

int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)

    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   if (Digits == 5 || Digits == 3)
   {    // Adjust for five (5) digit brokers.
      pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
   } 
   else 
    {    
      pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; 
    }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
     
   
    
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   
        
   int i=0;
   int ticket,total,result;
   total = OrdersTotal();                 
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 


     
     if(val1 > 0 && traded == false)
      { 
      // in the absence of an && indicator above I get continous print statements
      // with indicator added && indicator above, then it prints A and B once as it should ???
      // I need to work this out so it won't print all the time aka trade all the time
      // A and B first values seems to initialize the whole block
      // just a reminder that they time stamps coordinate after this FYI
      // now work on C retrace and possibly signals
      // add options for user to select some candle patterns
      // add options to select indicators
      // add bells and whistles to make things fun
      // alerts,sounds,maybe poppup video animation or something
      
      double B = val1;
      Print(B, " B high");
         if(val2==0)
            {
            for (i=0; val2==0; i++)
               {
               val2=iFractals(NULL, 0, MODE_LOWER, i);
               double A = val2;
                  if(A!=0)
                     {
                     Print(A, " A low");
                     }
               }
             }  
      traded=true;
      }
     
     if(val2 > 0 && traded == true)
      {
      B = val2;
      Print(B, " B low");
         if(val1==0)
            {
            for (i=0; val1==0; i++)
               {
               val1=iFractals(NULL, 0, MODE_UPPER, i);
               A = val1;
                  if(A!=0)
                     {
                     Print(A, " A high");
                     }
               }
             }  
      traded=false;
      }
     
                    
                
   return(0);
  }    

//+------------------------------------------------------------------+


      

Итак, у меня есть значения A и B, и если в начальном if(statements && indicators) стоит индикатор, то значения выводятся один раз, например, MACD быстрее > медленнее или что-то подобное.

Таким образом, я получаю только A и B, как мне хотелось бы.

Я не уверен, почему он печатает несколько раз, когда опции индикатора убраны из моих if(statements).

В любом случае, я немного приблизился к этой схеме типа ABCD, которая может быть использована и для других индикаторов, а не только для фракталов и т.д. На будущее.

Пожалуйста, посоветуйте

Спасибо

 

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

iCustom(Symbol(),0,"Fractal Store",0,"",0,0)

Это даст верхние фракталы. Измените "" на "L" для нижних фракталов.

iCustom(Symbol(),0,"Fractal Store",1,"",0,0)

Это даст фрактал перед последним фракталом.

Файлы:
 
heelflip43:

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

Это даст верхние фракталы. Измените "" на "L" для нижних фракталов.

Это даст фрактал перед последним фракталом.

Да, я вижу, что

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

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

Я вижу в вашем коде одну вещь, которая может помочь, это блок static datetime, и я использовал его только один раз, чтобы ссылаться на условие только тогда, когда приходит новый бар и новое время бара.
Эта часть может быть полезна для того, над чем я работаю. И хотя мой текущий код выводит текущий фрактал и предыдущий фрактал, в настоящее время он работает.

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

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

Я просмотрю этот код еще раз, и части EMPTY_VALUE. Теперь, когда я вижу, как это используется, я могу научиться и этому. Это было предложено раньше, но я так и не понял, как это использовать.

Я буду продолжать работать над этим.
Спасибо за помощь
 
И последнее, я заметил, что когда я добавляю, скажем, MACD к if(val1 > 0 && faster > slower && traded == false)

Тогда он работает и выдает только то, что я хочу - печатает A low, B high, затем и/или B low и A high

.

Но если я уберу быстрее > медленнее и быстрее < медленнее в обоих этих операторах if, то я замечу, что он НИКОГДА не печатает максимум A, а также постоянно печатает остальные, что меня смущает.


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

Назад к чертежной доске.


 

Я думаю, ваша проблема в том, что вы не сбросили значения val1 и val2. Поэтому, как только вы нашли максимум и последний минимум, вам нужно сбросить их:

double B = val1;
      Print(B, " B high");
         if(val2==0)
            {
            for (i=0; val2==0; i++)
               {
               //Print("i "+i);
               val2=iFractals(NULL, 0, MODE_LOWER, i);
               double A = val2;
                  if(A!=0)
                     {
                     Print(A, " A low");
                     }
               }
             }  
      traded=true;
      }
     
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 

     if(val2 > 0 && traded == true)
      {
      B = val2;
      Print(B, " B low");
         if(val1==0)
            {
            for (i=0; val1==0; i++)
               {
               val1=iFractals(NULL, 0, MODE_UPPER, i);
               A = val1;
                  if(A!=0)
                     {
                     Print(A, " A high");
                     }
               }
             }  
      traded=false;
      }
Надеюсь, это поможет.
Причина обращения: