Учимся логике

 

На самом деле все просто. Появилось желание помочь другим делать оптимальный код, да и самому поучиться у других.

Не секрет, что со временем вырабатываются вполне определенные стереотипы, которые иногда (чаще всего) помогают, а иногда и мешают.

Подготовлю вариант индикатора и попытаюсь объяснить что и почему сделано. Если конечно интересно будет.

 

Da, interesno!

Valera

 

на примере советника пожалуйста, индикаторы никого не интересуют.

 

Ну, значит, я - никто.

))) Говорил же давече - глюк я форумский, фикция, фата-моргана...

 
Svinozavr:

Ну, значит, я - никто.

))) Говорил же давече - глюк я форумский, фикция, фата-моргана...

Но всегда в нужное время и в нужном месте. Это радует! 

 

Виктор, а что тебя вдохновило на этот подвиг? На этом форуме не то, что с логикой, процентов 90 с головой не дружат.

Не боишься увязнуть в этом болоте? Тебе ж придется общаться не только с 10% адекватных...

===

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

"Иди один и исцеляй слепых,
Чтобы узнать в тяжелый час сомненья
Учеников злорадное глумленье
И равнодушие толпы."
// Ахматова

 
Vinin:

На самом деле все просто. Появилось желание помочь другим делать оптимальный код, да и самому поучиться у других.

Не секрет, что со временем вырабатываются вполне определенные стереотипы, которые иногда (чаще всего) помогают, а иногда и мешают.

Подготовлю вариант индикатора и попытаюсь объяснить что и почему сделано. Если конечно интересно будет.

//+-------------------------------------------------------------------------+
//| ver.RA                                                         all1.mq4 |
//|                                               Copyright © 2010, age_nt  |
//+-------------------------------------------------------------------------+

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Green
#property indicator_color2 Blue
#property indicator_color3 Red
#property indicator_color4 LightGray
#property indicator_color5 DarkOrange

#property indicator_level1 40
#property indicator_level2 20
#property indicator_level3 0
#property indicator_level4 -20
#property indicator_level5 -40

extern int       MA     =     10;
extern bool      all = FALSE; 
//---- Буферы индикатора
double EUR_Buffer[];
double USD_Buffer[];
double GBP_Buffer[];
double CHF_Buffer[];
double JPY_Buffer[];
//---- Переменные
int BarsMin=1000;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators

   IndicatorBuffers(5);

   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));

//---- indicator line
   SetIndexBuffer(0,EUR_Buffer);
   SetIndexBuffer(1,USD_Buffer);
   SetIndexBuffer(2,GBP_Buffer);
   SetIndexBuffer(3,CHF_Buffer);
   SetIndexBuffer(4,JPY_Buffer);
   
   bool showEUR, showUSD, showGBP, showCHF, showJPY, showRAVI;
   if ( StringFind(Symbol(), "EUR", 0) != -1) showEUR = TRUE;
   if ( StringFind(Symbol(), "USD", 0) != -1) showUSD = TRUE;
   if ( StringFind(Symbol(), "GBP", 0) != -1) showGBP = TRUE;
   if ( StringFind(Symbol(), "CHF", 0) != -1) showCHF = TRUE;
   if ( StringFind(Symbol(), "JPY", 0) != -1) showJPY = TRUE;

   if ( all== TRUE || showEUR == TRUE ) SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,DodgerBlue);
   else SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,0,CLR_NONE);
   if ( all == TRUE || showUSD == TRUE ) SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,ForestGreen);
   else SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,0,CLR_NONE);
   if ( all == TRUE || showGBP == TRUE ) SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,1,FireBrick);
   else SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,0,CLR_NONE);
   if ( all == TRUE || showCHF == TRUE ) SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,1,LightBlue);
   else SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,0,CLR_NONE);
   if ( all == TRUE || showJPY == TRUE ) SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,1,Orange);
   else SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,0,CLR_NONE);


   SetIndexLabel(0,"EUR");
   SetIndexLabel(1,"USD");
   SetIndexLabel(2,"GBP");
   SetIndexLabel(3,"CHF");
   SetIndexLabel(4,"JPY");

   
   SetIndexDrawBegin(0,0);
   SetIndexDrawBegin(1,0);
   SetIndexDrawBegin(2,0);
   SetIndexDrawBegin(3,0);
   SetIndexDrawBegin(4,0);

   
   IndicatorShortName("all1");

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int limit,i;
//     string S=Symbol();
     int counted_bars=IndicatorCounted();
     
  //---- проверка на возможные ошибки
     if(counted_bars<0) return(-1);

  //---- вычисление минимального кол-ва баров (длины отображаемого графика)
     if(counted_bars==0)
       {
       BarsMin=iBars("GBPUSD",NULL);
       if(BarsMin>iBars("USDCHF",NULL)) BarsMin=iBars("USDCHF",NULL);
       if(BarsMin>iBars("EURUSD",NULL)) BarsMin=iBars("EURUSD",NULL);
       if(BarsMin>iBars("USDJPY",NULL)) BarsMin=iBars("USDJPY",NULL);
       if(BarsMin>iBars("EURGBP",NULL)) BarsMin=iBars("EURGBP",NULL);
       if(BarsMin>iBars("EURCHF",NULL)) BarsMin=iBars("EURCHF",NULL);
       if(BarsMin>iBars("EURJPY",NULL)) BarsMin=iBars("EURJPY",NULL);
       if(BarsMin>iBars("GBPCHF",NULL)) BarsMin=iBars("GBPCHF",NULL);
       if(BarsMin>iBars("GBPJPY",NULL)) BarsMin=iBars("GBPJPY",NULL);
       if(BarsMin>iBars("CHFJPY",NULL)) BarsMin=iBars("CHFJPY",NULL);
       }

 //   
 Message(Vl(Symbol(),0,0));  
     
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
     if(limit>BarsMin-2) limit=BarsMin-2;
     
  //---- основной цикл

   //   for (i = 0; i<=limit;i++)
   //    {

   //    USD_Buffer[i]=USD(i);
   //    EUR_Buffer[i]=EUR(i); 
   //    GBP_Buffer[i]=GBP(i); 
   //    CHF_Buffer[i]=CHF(i); 
   //    JPY_Buffer[i]=JPY(i); 
  //     }
 
 
     //---- Вычисление индексов
     for (i = 0; i<=limit;i++)
      {
       USD_Buffer[i]=USD(i);
       EUR_Buffer[i]=EUR(i); 
       GBP_Buffer[i]=GBP(i); 
       CHF_Buffer[i]=CHF(i); 
       JPY_Buffer[i]=JPY(i); 
      }
     
//----
   return(0);
  }

//+------------------------------------------------------------------+
double USD(int j)
  {
  double val = 0;
  double GBP_USD=-Cl("GBPUSD",j);
  double USD_CHF=Cl("USDCHF",j);
  double EUR_USD=-Cl("EURUSD",j);
  double USD_JPY=Cl("USDJPY",j);
  val=(GBP_USD+USD_CHF+EUR_USD+USD_JPY)/4;
  return(val);
  }
//+------------------------------------------------------------------+
double GBP(int j)
  {
  double val = 0;
  double GBP_USD=Cl("GBPUSD",j);
  double EUR_GBP=-Cl("EURGBP",j);
  double GBP_CHF=Cl("GBPCHF",j);
  double GBP_JPY=Cl("GBPJPY",j);
  val=(EUR_GBP+GBP_USD+GBP_CHF+GBP_JPY)/4;
  return(val);
  }
//+------------------------------------------------------------------+
double EUR(int j)
  {
  double val = 0;
  double EUR_USD=Cl("EURUSD",j);
  double EUR_GBP=Cl("EURGBP",j);
  double EUR_CHF=Cl("EURCHF",j);
  double EUR_JPY=Cl("EURJPY",j);
  val=(EUR_USD+EUR_GBP+EUR_CHF+EUR_JPY)/4;  
  return(val);
  }
//+------------------------------------------------------------------+
double CHF(int j)
  {
  double val = 0;
  double USD_CHF=-Cl("USDCHF",j);
  double EUR_CHF=-Cl("EURCHF",j);
  double GBP_CHF=-Cl("GBPCHF",j);
  double CHF_JPY=Cl("CHFJPY",j);
  val=(USD_CHF+EUR_CHF+GBP_CHF+CHF_JPY)/4;
  return(val);
  }
//+------------------------------------------------------------------+
double JPY(int j)
  {
  double val = 0;
  double USD_JPY=-Cl("USDJPY",j);
  double EUR_JPY=-Cl("EURJPY",j);
  double GBP_JPY=-Cl("GBPJPY",j);
  double CHF_JPY=-Cl("CHFJPY",j);
  val=(USD_JPY+EUR_JPY+GBP_JPY+CHF_JPY)/4;
  return(val);
  }
//+------------------------------------------------------------------+
double Cl(string symb,int shift) 
  {
   double SMA1,SMA2,result,a,b; double k = 100*Vl(symb,0,shift); 
   double point = MarketInfo(symb,MODE_POINT); 
   double digits = MarketInfo(symb,MODE_DIGITS); 
   SMA1=iMA(symb,0,(101-k),0,MODE_LWMA,PRICE_TYPICAL,shift); 
   SMA2=iMA(symb,0,k,0,MODE_LWMA,PRICE_TYPICAL,shift); 
   result=((SMA1-SMA2)/(SMA2+0.000000001))*100;   
   a=50*(MathExp(2*result)-1)/(MathExp(2*result)+1);
   double norm = (a/point/100);    
   double target=NormalizeDouble(a,digits);  
   return(target);
  }   
double Vl(string symb,int tf,int Shi)  
{
 double v; //double k = Vol(symb,0,Bar); 
 if(iVolume(symb,0,Shi+1)<iVolume(symb,0,Shi+2)) v= iVolume(symb,0,Shi+1)/(0.0000001 +iVolume(symb,0,Shi+2));
 else v= iVolume(symb,0,Shi+2)/(0.0000001 +iVolume(symb,0,Shi+1));
 double fff=NormalizeDouble(v,2);
 return(fff); 
 }  
//+------------------------------------------------------------------+
//| Comment                                                          |
//+------------------------------------------------------------------+ 
//
void Message(string m) {  Comment(m);  if (StringLen(m)>0) Print(m);} 
//+------------------------------------------------------------------+     
Виктор! Если я правельно понял, Вы готовы помочь....не могу понять где у меня "нет логики"
 
age_nt:
Виктор! Если я правельно понял, Вы готовы помочь....не могу понять где у меня "нет логики"
Файлы:
logika.zip  254 kb
 

Спасибо Дмитрий за внимание...с уважением отношусь к Вашим знаниям....ну и юмору конечно.

Не смог оценить - не установлен MSoffffffis 

 
age_nt:

Спасибо Дмитрий за внимание...с уважением отношусь к Вашим знаниям....ну и юмору конечно.

Не смог оценить - не установлен MSoffffffis 

Знаете ли, а у нас нет проблем. Специально для ВАС в текстовом формате. Архивтор zip, очевидно у вас имеется. 

Файлы:
logika2.zip  90 kb
 
Еще для особо находчивых, у кого нет ни офиса ни зипа.
Файлы:
logika3.mq4  277 kb
Причина обращения: