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

 
Renat Akhtyamov :

여기서 고려해야 할 유일한 사항은 루프 블록 i==x 이후에

for(...){} 이후의 Array[i]는 배열 범위를 벗어난 오류를 반환하고 그게 전부입니다.

이것은 예를 들어 코드에서 나중에 변수 j가 있고 실수로 i라고 부르는 경우와 같이 가능한 오류에 대한 비옥한 기반을 제공합니다. 또는 배열의 인덱스 [1] 대신 [i] 등을 쓰십시오.
여기에서는 특정 코드가 있는 상황에 대해 쓴 것이 아니라 어떻게 될 수 있는지에 대한 예를 썼습니다. 그리고 어레이 경계를 넘어서는 출구가 없을 수 있고 오류를 포착하기 어려울 수 있으며, 그런 다음 이를 현지화하는 데 몇 분(몇 시간은 아니더라도) 많은 귀중한 시간을 소비할 수 있습니다.
 

말해봐, 그렇지 않으면 내가 지체되기 시작했어)

다음과 같은 디자인이 있습니다.

int RangeBar = 10 ;
 HighRange = iHigh (symbol, 0 , iHighest (symbol, 0 , MODE_HIGH ,RangeBar, 1 ));
 LowRange = iLow (symbol, 0 , iLowest (symbol, 0 , MODE_LOW ,RangeBar, 1 ));

N개의 캔들에 대한 범위High/ Low를 찾습니다.

질문: 동일한 High/ Low를 찾는 방법은 그림자가 아닌 바디로, 그림을 첨부합니다.

 
Vitaly Muzichenko :

말해봐, 그렇지 않으면 내가 지체되기 시작했어)

다음과 같은 디자인이 있습니다.

int RangeBar = 10 ;
 HighRange = iHigh (symbol, 0 , iHighest (symbol, 0 , MODE_HIGH ,RangeBar, 1 ));
 LowRange = iLow (symbol, 0 , iLowest (symbol, 0 , MODE_LOW ,RangeBar, 1 ));

N개의 캔들에 대한 범위High/ Low를 찾습니다.

질문: 동일한 High/ Low를 찾는 방법은 그림자가 아닌 바디로, 그림을 첨부합니다.

양초 fmax(Open[i],Close[i])의 상단과 양초 fmin(Open[i],Close[i])의 하단을 검색해야 합니다.
 
Artyom Trishkin :
양초 fmax(Open[i],Close[i])의 상단과 양초 fmin(Open[i],Close[i])의 하단을 검색해야 합니다.

즉, High / Low를 찾는 두 줄 대신 루프에서 반복을 수행하려면?

HighRange = iHigh (기호, 0 , iHighest (기호, 0 , MODE_HIGH , RangeBar, 1 ));

LowRange = iLow (기호, 0 , iLowest (기호, 0 , MODE_LOW , RangeBar, 1 ));

인디케이터가 아니라 어드바이저에 필요한 기능이고 어드바이저에서 제대로 작동하는데 바디별로 범위를 찾는 방법을 모르겠습니다.

 
Vitaly Muzichenko :

즉, High/Low를 찾는 두 줄 대신 루프에서 반복합니까?

HighRange = iHigh (기호, 0 , iHighest (기호, 0 , MODE_HIGH , RangeBar, 1 ));

LowRange = iLow (기호, 0 , iLowest (기호, 0 , MODE_LOW , RangeBar, 1 ));

인디케이터가 아니라 어드바이저에 필요한 기능이고 어드바이저에서 제대로 작동하는데 바디별로 범위를 찾는 방법을 모르겠습니다.

테스트 스크립트를 게시했습니다. 부정확성이있을 수 있습니다 - "무릎에"라고 썼습니다. 당신이 그것을 알아 내기 바랍니다.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link        "https://login.mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int       Begin= 1 ;       // Бар начала диапазона поиска
input int       RangeBars= 20 ;   // Диапазон поиска
//---
int bars= Bars ( Symbol (), PERIOD_CURRENT );
int begin=(Begin< 0 ? 0 :Begin>bars- 3 ?bars- 3 :Begin);
int rangeBars=(RangeBars< 2 ? 2 :
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   MqlRates array[];
   double    high= 0 , low= 0 ;
   int       highest=- 1 , lowest=- 1 ;
   if ( CopyRates ( Symbol (), PERIOD_CURRENT ,begin,rangeBars,array)> 0 ) {
       ArraySetAsSeries (array, true );
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print ( "High=" , DoubleToString (high, Digits ()), ", Highest=" ,highest, ", Low=" , DoubleToString (low, Digits ()), ", Lowest=" ,lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue( int bar_begin, MqlRates &array[], int &bar_highest){
   int       sz= ArraySize (array);
   if (sz== 0 ) return (- 1 );
   double    high= DBL_MIN ;
   bar_highest=- 1 ;
   for ( int i= 0 ; i<sz; i++) {
       double value= fmax (array[i].open,array[i].close);
       if (value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return (high);
}
//+------------------------------------------------------------------+
double GetLowestValue( int bar_begin, MqlRates &array[], int &bar_lowest){
   int       sz= ArraySize (array);
   if (sz== 0 ) return (- 1 );
   double    low= DBL_MAX ;
   bar_lowest=- 1 ;
   for ( int i= 0 ; i<sz; i++) {
       double value= fmin (array[i].open,array[i].close);
       if (value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return (low);
}
//+------------------------------------------------------------------+
무엇이든 물어보세요...
 
Artyom Trishkin :

테스트 스크립트를 게시했습니다. 부정확성이있을 수 있습니다 - "무릎에"라고 썼습니다. 당신이 그것을 알아 내기 바랍니다.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
무엇이든 물어보세요...

감사합니다. 잘 작동합니다!

추신. 나는 이것이 다섯 번째에서 작동한다는 것을 이해합니까?

 
Vitaly Muzichenko :

감사합니다. 잘 작동합니다!

추신. 나는 이것이 다섯 번째에서 작동한다는 것을 이해합니까?

네. 크로스 플랫폼 코드를 만들려고 합니다. 또는 상위 5개 아래에서 최소한의 수정으로.
 
안녕하세요. 팔이 삐뚤빼뚤. 판매(slevel)를 위한 손절매 수표를 추가하는 데 도움을 주세요. 그런 다음 그는 가격을 따라잡습니다.
int start()
{
//+--------------------------------------------------------------------+
//|   -= stop loss в без убыток =-                                      |
//+--------------------------------------------------------------------+
bool    result;
double stop;
int     cmd,error;
for ( int i= 0 ;i< OrdersTotal ();i++)
{
if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ) && OrderProfit ()>pOPCS)
{
cmd= OrderType ();
double blevel= OrderStopLoss ()< Bid - Point *TS;
double slevel= OrderStopLoss ()> Ask + Point *TS;
//---
if (cmd== OP_BUY || cmd== OP_SELL )
{
while ( true )
{
if (cmd== OP_BUY && blevel) stop= Bid - Point *TS;
else                       stop= Ask + Point *TS;
result= OrderModify ( OrderTicket (), OrderOpenPrice (),stop, 0 , 0 ,Orange);
if (result!= TRUE ) { error= GetLastError (); Print ( "LastError = " ,error); }
else error= 0 ;
if (error== 135 ) RefreshRates ();
else break ;
}
}
}
}
 
Artyom Trishkin :

테스트 스크립트를 게시했습니다. 부정확성이있을 수 있습니다 - "무릎에"라고 썼습니다. 당신이 그것을 알아 내기 바랍니다.

무엇이든 물어보세요...

Artyom에게 미안하지만 이 문제에 대한 해결책을 좀 더 간단하게 보여주고 싶습니다.

   double openCandle[], closeCandle[];
   CopyOpen ( _Symbol , PERIOD_CURRENT , 1 , 15 , openCandle);
   CopyClose ( _Symbol , PERIOD_CURRENT , 1 , 15 , closeCandle);
   double maxCandle = fmax (openCandle[ ArrayMaximum (openCandle)], closeCandle[ ArrayMaximum (closeCandle)]);
   double minCandle = fmin (openCandle[ ArrayMinimum (openCandle)], closeCandle[ ArrayMinimum (closeCandle)]);

나는 이것을 당신의 코드에 배열하고 모든 사람이 필요한 검사를 추가할 수 있기를 바랍니다. 성능은 mql4와 mql5에서 모두 동일합니다.

 
Alexey Viktorov :

Artyom에게 미안하지만 이 문제에 대한 해결책을 좀 더 간단하게 보여주고 싶습니다.

   double openCandle[], closeCandle[];
   CopyOpen ( _Symbol , PERIOD_CURRENT , 1 , 15 , openCandle);
   CopyClose ( _Symbol , PERIOD_CURRENT , 1 , 15 , closeCandle);
   double maxCandle = fmax (openCandle[ ArrayMaximum (openCandle)], closeCandle[ ArrayMaximum (closeCandle)]);
   double minCandle = fmin (openCandle[ ArrayMinimum (openCandle)], closeCandle[ ArrayMinimum (closeCandle)]);

나는 이것을 당신의 코드에 배열하고 모든 사람이 필요한 검사를 추가할 수 있기를 바랍니다. 성능은 mql4와 mql5에서 모두 동일합니다.

영형! 고맙습니다. 아침에 스스로는 추측하지 못했습니다... 그러나 배열이 채워지는 것을 확인하는 것은 동일합니다. 상위 4위 안에는 본 적이 없고 상위 5위 안에는 이력 데이터가 부족해 처음에는 데이터가 채워지지 않는 경우가 많다.

추신. 더 많이 자야합니다. 그 방향의 생각이 효과가 있을 것입니다.