학습 논리 - 페이지 14

 

대체 코드:

 // заменяем кучу одинаковых переменных на массивы -- 9 -- количество таймфреймов

bool TrBBTurnUP[ 9 ];
bool TrBBTurnDN[ 9 ];

bool TrMomTurnUP[ 9 ];
bool TrMomTurnDN[ 9 ];

int TimeFrames[ 9 ] = { 1 , 5 , 15 , 30 , 60 , 240 , 1440 , 10080 , 43200 };

int init()
{
   // не забываем инициализировать
   ArrayInitialize (TrBBTurnUP, false);
   ArrayInitialize (TrBBTurnDN, false);

   ArrayInitialize (TrMomTurnUP, false);
   ArrayInitialize (TrMomTurnDN, false);
}

int GetTFIndex( int TF)
{
   switch (TF)
   {
       case 1 :     return ( 0 );
       case 5 :     return ( 1 );
       case 15 :     return ( 2 );
       case 30 :     return ( 3 );
       case 60 :     return ( 4 );
       case 240 :   return ( 5 );
       case 1440 :   return ( 6 );
       case 10080 : return ( 7 );
       case 43200 : return ( 8 );
   }
   return (- 1 );
}

// обратное преобразование
int GetTFByIndex( int index)
{
   if (index < 0 || index > 8 ) return (- 1 );
   return (TimeFrames[index]);
}

int AnaliseFunc ( string sy, int tf)
{
   CurAsk = MarketInfo( Symbol (), MODE_ASK);
   CurBid = MarketInfo( Symbol (), MODE_BID);
   
   OpnPrice = iOpen( NULL , PERIOD_M5 , 0 );
   OpnPrice1 = iOpen( NULL , PERIOD_M5 , 1 );
   ClsPrice1 = iClose( NULL , PERIOD_M5 , 1 );
   
   if (sy== "" || sy== "0" ) sy = Symbol ();

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

   double BB_1  = iCustom (sy, tf, "BB_MA" , 13 , 1 , 1 , 1 );
   double BB_2  = iCustom (sy, tf, "BB_MA" , 13 , 1 , 1 , 2 );
   double BB_3  = iCustom (sy, tf, "BB_MA" , 13 , 1 , 1 , 3 );
   
   double AO1   = iAO (sy, tf, 1 );
   double AO2   = iAO (sy, tf, 2 );
   double AO3   = iAO (sy, tf, 3 );
   
   double AC1   = NormalizeDouble ( iAC (sy, tf, 1 ), 8 )* 1000 ;
   double AC2   = NormalizeDouble ( iAC (sy, tf, 2 ), 8 )* 1000 ;
   double AC3   = NormalizeDouble ( iAC (sy, tf, 3 ), 8 )* 1000 ;
   double AC4   = NormalizeDouble ( iAC (sy, tf, 4 ), 8 )* 1000 ;
   double AC5   = NormalizeDouble ( iAC (sy, tf, 5 ), 8 )* 1000 ;
   
   double SpMan1= iCustom (sy, tf, "SpearmanRankCorr" , 14 , 1000 , 30 , true, 0 , 1 );
   double SpMan2= iCustom (sy, tf, "SpearmanRankCorr" , 14 , 1000 , 30 , true, 0 , 2 );
   
   double DeM_1 = iDeMarker (sy, tf, 14 , 1 );
   double DeM_2 = iDeMarker (sy, tf, 14 , 2 );
   
   double Mom_1 = iMomentum (sy, tf, 14 , PRICE_CLOSE , 1 );
   double Mom_2 = iMomentum (sy, tf, 14 , PRICE_CLOSE , 2 );
   double Mom_3 = iMomentum (sy, tf, 14 , PRICE_CLOSE , 3 );
   
   // прямой доступ по индексу всегда быстрее перебора значений. Здесь мы перебираем один раз -- когда ищем индекс ТФ
   int TFIndex = GetTFIndex(tf);
   if (TFIndex == - 1 )
   {
       Print ( "Wrong TF as parameter: " , tf);
       return ( 0 );
   }

//---------------- Проверка на разворот BB_MA -------------------------------------------------------   
   
   if (BB_1>BB_2 && BB_2<=BB_3 && BB_1< 0 )                               // Найден разворот BB вверх
   {
      TrBBTurnUP[TFIndex] = true;
      TrBBTurnDN[TFIndex] = false;
   }

   if (BB_1<BB_2 && BB_2>=BB_3 && BB_1> 0 )                               // Найден разворот BB вниз
   {
      TrBBTurnUP[TFIndex] = false;
      TrBBTurnDN[TFIndex] = true;
   }
   
//---------------------- Проверка на разворот Momentum -----------------------------------------------
   
   if (Mom_1>Mom_2 && Mom_2<=Mom_3 && Mom_1< 100.0 )
   {
      TrMomTurnUP[TFIndex] = true;
      TrMomTurnDN[TFIndex] = false;
   }
      
   if (Mom_1<Mom_2 && Mom_2>=Mom_3 && Mom_1> 100.0 )
   {
      TrMomTurnUP[TFIndex] = false;
      TrMomTurnDN[TFIndex] = true;
   }
}
 
TheXpert :

대체 코드:


if(index>0 || index>8) return (-1);

아마도 if(index < 0 || ...) ...; ?

 
네. 수정했습니다. 감사합니다.
 
TheXpert :

코드의 두 번째 버전은 정말 더 좋고 .. 더 예뻐요

--

때로는 사실입니다... 분산 코드보다 크기 최적화 코드를 유지하기가 더 어려울 때

즉, 더 광범위하게 작성된 것이 때로는 수행하기 더 쉽습니다.

--

SQL에서는 거꾸로 ... 코드 최적화


하나의 쿼리에 넣어도 아프다


여기 흥미로운 것이 있습니다 ...

예를 들어, 하나의 복잡한 쿼리의 SQL 코드는 여러 개의 연속 SQL 쿼리보다 읽기 어렵습니다.

그리고 그것이 얼마나 놀라운 일이든 간에, 세 개의 SIMPLE 쿼리의 속도(종종 더 높음)는 하나의 누적된(최적화된 것처럼 보이는) 쿼리를 실행하는 것보다 더 빠릅니다.


복잡한 SQL 쿼리를 작성하는 사람들의 논리는 ... 고통받습니다 .. 단지 .. 때문에 ..

1- 동반하기 불편하다

2 - 더 느리게 작동

--

귀하의 코드에 적용되지 않습니다

이건 그냥 경험상..

 

그리고 여기 내가 정말 좋아하는 것이 있습니다 ... 나는 그의 첫 번째 코드 인 지점에서 Igor Kim을 데려갔습니다.

 //+------------------------------------------------------------------+
//| Возвращает интервал установки сигнальных указателей              |
//+------------------------------------------------------------------+
int GetArrowInterval() {
   int p = Period ();

   switch (p) {
     case 1 :     return ( 4 );
     case 5 :     return ( 5 );
     case 15 :     return ( 6 );
     case 30 :     return ( 8 );
     case 60 :     return ( 10 );
     case 240 :   return ( 20 );
     case 1440 :   return ( 40 );
     case 10080 : return ( 80 );
     case 43200 : return ( 150 );
  }
}

...그리고 그의 두 번째 것:

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//+----------------------------------------------------------------------------+
//|  Описание : Возвращает интервал установки сигнальных указателей            |
//|  Параметры:                                                                |
//|    pr - процент относительно ценового размера окна                         |
//+----------------------------------------------------------------------------+
int GetArrowInterval( int pr= 7 ) {
   if (pr<= 0 ) pr= 7 ;
   return ((WindowPriceMax()-WindowPriceMin())/ 100 *pr/ Point );
}
어때요??? 개인적으로 만족스러웠습니다... :))
 

지표를 만들었습니다. 그러나 ZZCount>1이면 터미널을 단단히 끊습니다. 오류가 없는 것 같습니다

누구든지 이유를 찾을 수 있습니까?

파일:
 
for (int j=0;   i   <ZZCount;j++) {
 
TheXpert :


그리고 노파에게 구멍이 있습니다.

매우 감사합니다!

 

때로는 데이터를 건드리지 않고 MQL4에서 데이터를 정렬해야 할 필요가 있습니다. MQL4에는 포인터가 없으며 구조도 없습니다.

포인터 에뮬레이션을 통해 서로 다른 매개변수로 데이터를 정렬하는 스크립트의 예를 제공합니다. 아마도 누군가는 이 접근 방식과 정렬 기능이 필요할 것입니다.

 #define AMOUNT 5

string Symbols[AMOUNT] = { "EURUSD" , "GBPUSD" , "USDJPY" , "USDCHF" , "EURGBP" };
int Profit[AMOUNT] = { 50 , - 130 , 90 , 2000 , 0 };
int Pos[AMOUNT] = { 3 , 0 , 6 , 7 , 1 };
int SL[AMOUNT] = { 20 , 60 , 10 , 80 , 100 };

void SortArrayINT( int Array[], int & Positions[], bool Increase = TRUE )
{
  int i, j, Tmp, Size = ArraySize (Array);
    
  if ( ArraySize (Positions) != Size)
    ArrayResize (Positions, Size);
  
  for (i = 0 ; i < Size; i++)
    Positions[i] = i;

  if (Increase)
  {
    for (i = 0 ; i < Size - 1 ; i++)
      for (j = i + 1 ; j < Size; j++)
        if (Array[Positions[i]] > Array[Positions[j]])
        {
          Tmp = Positions[j];
          Positions[j] = Positions[i];
          Positions[i] = Tmp;
        }
  }
  else 
    for (i = 0 ; i < Size - 1 ; i++)
      for (j = i + 1 ; j < Size; j++)
        if (Array[Positions[i]] < Array[Positions[j]])
        {
          Tmp = Positions[j];
          Positions[j] = Positions[i];
          Positions[i] = Tmp;
        }
    
  
  return ;
}

void PrintInfo( string SortName, int Array[] )
{
  int Positions[];
  
  SortArrayINT(Array, Positions);
  
  Print ( "Sort by " + SortName);
  Print ( "SYMBOL   PROFIT   POS   SL" );

  for ( int i = 0 ; i < AMOUNT; i++)
    Print (Symbols[Positions[i]] + "   " + Profit[Positions[i]] + "   " +
          Pos[Positions[i]] + "   " + SL[Positions[i]]);
          
  Print ( "" );
          
  return ;
}

void start()
{
  PrintInfo( "PROFIT" , Profit); // распечатали данные, отсортированные по параметру Profit
  PrintInfo( "POS" , Pos); // распечатали данные, отсортированные по параметру Pos
  PrintInfo( "SL" , SL); // распечатали данные, отсортированные по параметру SL
  
  return ;
}

작업 결과:

 
고마워, 껴안아...