MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 145

 
fxsaber :

ArraySort 및 간단한 구조의 경우 작성하기 쉽습니다.

게시자:
#include <TypeToBytes.mqh>

template < typename T>
void Swap( T &Value1, T &Value2 )
{
   const T Tmp = Value1;
  
  Value1 = Value2;
  Value2 = Tmp;
}

// Сортировка массива любого простого типа
template < typename T>
bool MyArraySort( T &Array[] )
{
   if (! ArraySort (Array))
  {
     const int Size = ArraySize (Array);
    
     for ( int i = 0 ; i < Size - 1 ; i++)
    {
       const T Tmp = Array[i];
      
       for ( int j = i + 1 ; j < Size; j++)
         if (_R(Tmp) == Array[j]) // TypeToBytes.mqh
        {
          Swap(Array[i + 1 ], Array[j]);
          
          i++;
        }
    }      
  }
  
   return ( true );
}

// Возвращает количество различных элементов массива, которых не меньше Repeat
template < typename T>
int Strange( const T &InArray[], const int Repeat = 2 )
{
   int Res = 0 ;  
  
  T Array[];
  
   const int Size = ArraySize (InArray);
  
   if (( ArrayCopy (Array, InArray) == Size) && MyArraySort(Array))
  {    
     int Tmp = 1 ;
    
     for ( int i = 1 ; i < Size; i++, Tmp++)
       if (_R(Array[i - 1 ]) != Array[i]) // TypeToBytes.mqh
      {
         if (Tmp >= Repeat)
          Res++;
        
        Tmp = 0 ;
      }
      
     if (Tmp >= Repeat)    
      Res++;
  }

   return (Res);
}

void OnStart ()
{
   int Array[] = { 1 , 2 , 2 , 3 , 3 , 3 , 4 , 4 , 4 , 4 };  
   const int Size = ArraySize (Array);

   MqlTick Ticks[], NullTick = { 0 };
   ArrayResize (Ticks, Size);        
  
   for ( int i = 0 ; i < Size; i++)
  {
    Ticks[i] = NullTick;
    
    Ticks[i].time = Array[i];
  }
  
   for ( int i = 1 ; i <= 4 ; i++)
  {
     Print (Strange(Array, i));
    
     Print (Strange(Ticks, i));
  }
}
 

안녕하세요, 서면 고문 에게 도움을 요청합니다. 그렇게 부를 수 있다면.

일반적으로 고문은 내가 그에게 기대한 대로 합니다. 하지만 이해할 수 없는 오류가 하나 있습니다.

1) 어떤 경우에는 평신도가 아닌 0.02로 많이 매도를 여는 경우가 있습니다. 대본에 따르면, 그는해서는 안됩니다. (어딘가 오류). 이게 무슨 연관이 있는지 이해가 안 가는데, 가끔은 모든 게 시계처럼 돌아가고 때로는 Sell이 먼저 충돌하기도 합니다.

이 오류를 도와주세요. 그리고 어렵지 않은 경우 쓰기 및 내 실수에 대한 일반적인 의견. 이것은 나의 첫 번째 조언자이며 엄격하게 판단 할 수 있습니다.

//+------------------------------------------------------------------+
//|                                               ALEXANDROS_001.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
input double perv_Lot= 0.01 ;
input double   shag1= 40 ;
input double   profit= 20 ;
input double   koredor= 10 ;
input int     magic= 907 ;
input int     slipage= 10 ;
int ret,ORD= 0 ,ic;
//
void OnTick ()
  {

//-----ищет цену последнего открытого ордера---------------------------------------------------------------
   double OpenPrice = 0.0 ;
  
     int     orders= OrdersTotal ();    
       for ( int i=orders- 1 ;i>= 0 ;i--)
        {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== false ) { Print ( "Error in history!" ); break ; }
         if ( OrderSymbol ()!= Symbol ()) continue ;
         if (   OrderType ()== OP_SELL || OrderType ()== OP_BUY )
        
           OpenPrice = OrderOpenPrice ();
                     break ;
        }

//------если нет открытых позиций открывает два отложника------------------------------------------------------
   int kolpos= 0 ;
   for ( int pos= 0 ; pos< OrdersTotal (); pos++)
  {
   OrderSelect (pos, SELECT_BY_POS , MODE_TRADES );
   if ( OrderSymbol ()== Symbol ()&& OrderMagicNumber ()==magic)
   kolpos++;  
    }
     if (kolpos== 0 )
    {
     OrderSend ( Symbol (), OP_BUYSTOP ,perv_Lot, Ask +shag1* Point ,slipage, 0 , 0 , NULL ,magic, 0 , clrGreen );
     OrderSend ( Symbol (), OP_SELLSTOP ,perv_Lot, Bid -shag1* Point ,slipage, 0 , 0 , NULL ,magic, 0 , clrRed );
    }
//--------------определяет если есть открытые позиции---------------------------------------------------------------------  
     int order= 0 ;
   for ( int pos= 0 ; pos< OrdersTotal (); pos++)
  {
   OrderSelect (pos, SELECT_BY_POS , MODE_TRADES );
   if ( OrderSymbol ()== Symbol ()&& OrderMagicNumber ()==magic)
  
   if ( OrderType ()== OP_SELL || OrderType ()== OP_BUY ) //если это продажи или покупки считаем что сделки открыты
  
   order++;
    }
     if (order> 0 )
//--------------- находит и удаляет отложки.---------------------------------------------------------------
    {
    
     for (ic= OrdersTotal ()- 1 ;ic>= 0 ;ic--)
                   {
                   if ( OrderSelect (ic, SELECT_BY_POS , MODE_TRADES )== false ) continue ;
                   if ( OrderSymbol ()== Symbol ())
                  {                  
                   if ( OrderType ()== OP_BUYSTOP || OrderType ()== OP_SELLSTOP ) //если это отложки то удаляем
                  {
                  ret= OrderDelete ( OrderTicket ()); //удалил отложки
                  }
                  }}
//--------------ищем последний открытый ордер-------------------------------------    
                   for (ic= OrdersTotal ()- 1 ;ic>= 0 ;ic--)
                   {
                   if ( OrderSelect (ic, SELECT_BY_POS , MODE_TRADES )== false ) continue ;
                   if ( OrderSymbol ()== Symbol ()&& OrderMagicNumber ()==magic&& OrderOpenPrice ()==OpenPrice)
                  
                  
                  {
                
                   double minus= NormalizeDouble ( Ask -OpenPrice, Digits );
                   double plus= NormalizeDouble ( Ask -OpenPrice, Digits );
                   if ( Digits == 3 )
                   {
                    minus=minus* 100 ;
                    plus=plus* 100 ;
                   }
                   if ( Digits == 5 )
                   {
                   minus=minus* 10000 ;
                   plus=plus* 10000 ;
                   }
   //-------------если последний открытый ордер SELL--------------------------------------------------------------                
                   if ( OrderType ()== OP_SELL )
                  {
                   if (plus<=-profit)
                  {
                   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
                  {
                   OrderSelect (i, SELECT_BY_POS , MODE_TRADES );
                   if ( OrderType ()== OP_BUY ) OrderClose ( OrderTicket (), OrderLots (), Bid ,slipage, 0 );
                   if ( OrderType ()== OP_SELL ) OrderClose ( OrderTicket (), OrderLots (), Ask ,slipage, 0 );
                  }
                  }
//---------------а если цена пошла в минус---------------------------------------------------------------------------                
                 if ( minus>=koredor)
                  {
                   double Lot= OrderLots ();
                   OrderSend ( Symbol (), OP_BUY ,Lot* 2 , Ask ,slipage, 0 , 0 , NULL ,magic, 0 , clrRed ); // открываем BUY с удвоеным лотом
                  }
                  }
                   double minusbuy= NormalizeDouble ( Ask -OpenPrice, Digits );
                   double plusbuy= NormalizeDouble ( Ask -OpenPrice, Digits );
                   if ( Digits == 3 )
                   {
                    minusbuy=minusbuy* 100 ;
                    plusbuy=plusbuy* 100 ;
                   }
                   if ( Digits == 5 )
                   {
                   minusbuy=minusbuy* 10000 ;
                   plusbuy=plusbuy* 10000 ;
                   }
//-----------------если последний ордер Buy--------------------------------------------------------------------------------
                   if ( OrderType ()== OP_BUY )
                  {
                   if (plusbuy>=profit) //-------если цена пошла в плюс-------------------------------------------------------
                  {
                   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
                  {
                   OrderSelect (i, SELECT_BY_POS , MODE_TRADES ); //---находим и закрываем все открытые ордера--------------------
                   if ( OrderType ()== OP_BUY ) OrderClose ( OrderTicket (), OrderLots (), Bid ,slipage, 0 );
                   if ( OrderType ()== OP_SELL ) OrderClose ( OrderTicket (), OrderLots (), Ask ,slipage, 0 );
                  }
                  }
//-----------------------------а если цена пошла в минус------------------------------------------------------------------                
                   if (minusbuy<=-koredor)
                  {
                   Comment ( "Ордеров -" ,order);
                   double Lot= OrderLots ();
                   OrderSend ( Symbol (), OP_SELL ,Lot* 2 , Bid ,slipage, 0 , 0 , NULL ,magic, 0 , clrRed ); //открываем ордер SELL с удвоенным лотом----
                  }
                  }
   }}}}

 
Alexandr Nevadovschi :

안녕하세요, 서면 고문 에게 도움을 요청합니다. 그렇게 부를 수 있다면.

일반적으로 고문은 내가 그에게 기대한 대로 합니다. 하지만 이해할 수 없는 오류가 하나 있습니다.

1) 어떤 경우에는 평신도가 아닌 0.02로 많이 매도를 여는 경우가 있습니다. 대본에 따르면, 그는해서는 안됩니다. (어딘가 오류). 이게 무슨 연관이 있는지 이해가 안 가는데, 때로는 모든 것이 시계처럼 작동하고 때로는 Sell이 먼저 충돌하기도 합니다.

이 오류를 도와주세요. 그리고 쓰기와 내 실수에 대한 어려운 일반적인 의견이 아니라면. 이것은 나의 첫 번째 조언자이며 엄격하게 판단 할 수 있습니다.


먼저 스타일러(Ctrl+,)를 이용해서 컴파일러가 내뱉은 지적을 모두 수정하세요.

P‌그들은 다음과 같습니다.

                   double minusbuy= NormalizeDouble ( Ask -OpenPrice, Digits );
                   double plusbuy= NormalizeDouble ( Ask -OpenPrice, Digits );
                   if ( Digits == 3 )
                   {
                    minusbuy=minusbuy* 100 ;
                    plusbuy=plusbuy* 100 ;
                   }
                   if ( Digits == 5 )
                   {
                   minusbuy=minusbuy* 10000 ;
                   plusbuy=plusbuy* 10000 ;
                   }

l‌ 쉽고 자연스럽게 다음과 같이 변경됩니다.

                   double minusbuy= NormalizeDouble (( Ask -OpenPrice)/ _Point , Digits );
                   double plusbuy=minusbuy;

A‌는 유사하고 코드에서 더 높습니다.

왜 Ask가 구매와 판매 모두에 대해 계산되는지 명확하지 않지만 계산은 주문 유형이 결정되기 전에 이루어집니다. 예, OpenPrice는 몇 사이클 더 일찍 어떻게든 멀리 결정됩니다.

 
Vitalie Postolache :


먼저 스타일러(Ctrl+,)를 이용해서 컴파일러가 내뱉은 지적을 모두 수정하세요.

P‌그들은 다음과 같습니다.

                   double minusbuy= NormalizeDouble ( Ask -OpenPrice, Digits );
                   double plusbuy= NormalizeDouble ( Ask -OpenPrice, Digits );
                   if ( Digits == 3 )
                   {
                    minusbuy=minusbuy* 100 ;
                    plusbuy=plusbuy* 100 ;
                   }
                   if ( Digits == 5 )
                   {
                   minusbuy=minusbuy* 10000 ;
                   plusbuy=plusbuy* 10000 ;
                   }

l‌ 쉽고 자연스럽게 다음과 같이 변경됩니다.

                   double minusbuy= NormalizeDouble (( Ask -OpenPrice)/ _Point , Digits );
                   double plusbuy=minusbuy;

A‌는 유사하고 코드에서 더 높습니다.

왜 Ask가 구매와 판매 모두에 대해 계산되는지 명확하지 않지만 계산은 주문 유형이 결정되기 전에 이루어집니다. 예, OpenPrice는 몇 사이클 더 일찍 어떻게든 멀리 결정됩니다.


감사합니다. 해결해 보겠습니다.
 

인사말. 테스트할 때 "'E:\MT4-1\Alpari Limited MT4\MQL4\indicators\WmiFor.ex4 표시기 매개변수' [2] 파일을 열 수 없습니다."라고 표시되는 이유를 알려주십시오.

표시기가 있으며 작동합니다. https://www.mql5.com/ru/code/10394

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

extern string WmiFor             = "Параметры индикатора WmiFor" ;
extern bool IsTopCorner = true ; // Информационный блок в верхнем углу?
extern int Offset = 1 ; // Смещение исходного образца в барах (для проверки надежности прогноза) [1..]
extern bool IsOffsetStartFixed = true ; // Фиксировано ли начало образца
extern bool IsOffsetEndFixed = false ; // Фиксирован ли конец образца
extern int PastBars = 24 ; // Размер образца в барах, который ищется на истории [3..]
extern int ForecastBars = 24 ; // На сколько баров вперед делать прогноз [1..]
extern int MaxAlts = 5 ; // Искать указанное кол-во лучших образцов [1..100]
extern bool ShowCloud = true ; // Показывать ли облако
extern bool ShowBestPattern = true ; // Показывать ли максимально близкий образец
extern bool IsExactTime = true ; // Должно ли совпадать время образцов (для учета эффекта сессий)
extern datetime MinDate = D'01.01.2001' ; // Минимальная дата образца
extern int PeriodMA = 2 ; // Периуд сглаженной средней
extern double ScalePercents = 90.0 ; // Рассматривать только образцы с этим минимальным процентом совпадения
extern color IndicatorCloudColor = Sienna; // Цвет облака похожих вариантов
extern color IndicatorBestPatternColor = DodgerBlue; // Цвет самого похожего образца
extern color IndicatorVLinesColor = Sienna; // Цвет вертикальных линий-границ образца
extern color IndicatorTextColor = MediumBlue; // Цвет текста инф.блока
extern color IndicatorTextWarningColor = Tomato; // Цвет предупреждений в тестовом инф.блоке
extern int XCorner = 5 ; // Отступ инф.блока индикатора от правой границы графика
extern int YCorner = 5 ; // Отступ инф.блока индикатора от верхней границы графика
extern string FontName = "Arial" ; // Шрифт тестового инф.блока
extern int FontSize = 7 ; // Размер шрифта тестового инф.блока

double Index0, Index1, Index2, Index3, Index4, Index5;

void OnTick ()
  {

Index0 = iCustom ( NULL , 0 , WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 0 , 3 );

Index1 = iCustom ( NULL , 0 , WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 1 , 3 );

Index2 = iCustom ( NULL , 0 , WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 2 , 3 );

Index3 = iCustom ( NULL , 0 , WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 3 , 3 );

Index4 = iCustom ( NULL , 0 , WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 4 , 3 );

Index5 = iCustom ( NULL , 0 , WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 5 , 3 );

Comment ( "0==" , DoubleToString (Index0, Digits ), "     1==" , DoubleToString (Index1, Digits ),   "      2==" , DoubleToString (Index2, Digits ),
"     3==" , DoubleToString (Index3, Digits ), "     4==" , DoubleToString (Index4, Digits ), "     5==" , DoubleToString (Index5, Digits ));
  
  }
//+------------------------------------------------------------------+


 
Andrey Sokolov :

인사말. 테스트할 때 "'E:\MT4-1\Alpari Limited MT4\MQL4\indicators\WmiFor.ex4 표시기 매개변수' [2] 파일을 열 수 없습니다."라고 표시되는 이유를 알려주십시오.

표시기가 있으며 작동합니다. https://www.mql5.com/ru/code/10394

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

extern string WmiFor              = " Параметры индикатора WmiFor " ;

void OnTick ()
  {

Index5 = iCustom ( NULL , 0 , WmiFor , IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 5 , 3 );

Comment ( "0==" , DoubleToString (Index0, Digits ), "     1==" , DoubleToString (Index1, Digits ),   "      2==" , DoubleToString (Index2, Digits ),
"     3==" , DoubleToString (Index3, Digits ), "     4==" , DoubleToString (Index4, Digits ), "     5==" , DoubleToString (Index5, Digits ));
  
  }
//+------------------------------------------------------------------+
" iCustom " 및 표시기에 올바르게 액세스하는 방법에 대한 설명서를 읽으십시오.
 
Vitaly Muzichenko :
" iCustom " 및 표시기에 올바르게 액세스하는 방법에 대한 설명서를 읽으십시오.


감사해요.

인용문을 잊어버렸어, 로샤라.

 

안녕하세요!

무엇이 잘못되었는지 알아내도록 도와주세요. 선이 교차할 때 가격을 표시할 막대가 필요합니다. 코드를 작성했습니다.

정수 시작() {

이중 pr=ObjectGetValueByShift("줄", 0);

경고 (pr);

반환(0);‌}

라인 - 라인 이름.

이 코드는 항상 "0"을 표시합니다. 뭐가 문제 야?

 
Kot :

안녕하세요!

무엇이 문제인지 알아낼 수 있도록 도와주세요. 선이 교차할 때 가격을 표시할 막대가 필요합니다. 코드를 작성했습니다.

정수 시작() {

이중 pr=ObjectGetValueByShift("줄", 0);

경고(pr);

반환(0);‌}

라인 - 라인 이름.

이 코드는 항상 "0"을 표시합니다. 뭐가 문제 야?


추세선이 있습니까?

그리고 그것은 시각적으로 0 막대를 (아래) 통과합니다. 아니요, 속성에 눈금을 표시하십시오. 빔.

 

좋은 오후에요 여러분!

‌질문, Instagram에서 주문을 보내 려고 할 때 정류장이 잘못되었다고 표시됩니다.

라인 자체에서:

OrderSend(Symbol(),OP_BUYSTOP,Lots,HiP,3,0,0,NULL,111,0,clrBlue);

손절매에서는 0입니다. 손절매에 숫자를 넣으면 모든 것이 정상입니다.

A‌ 손절매는 필요하지 않습니다. 어떻게 될 것인가?