for(...){} 이후의 Array[i]는 배열 범위를 벗어난 오류를 반환하고 그게 전부입니다.
이것은 예를 들어 코드에서 나중에 변수 j가 있고 실수로 i라고 부르는 경우와 같이 가능한 오류에 대한 비옥한 기반을 제공합니다. 또는 배열의 인덱스 [1] 대신 [i] 등을 쓰십시오.
여기에서는 특정 코드가 있는 상황에 대해 쓴 것이 아니라 어떻게 될 수 있는지에 대한 예를 썼습니다. 그리고 어레이 경계를 넘어서는 출구가 없을 수 있고 오류를 포착하기 어려울 수 있으며, 그런 다음 이를 현지화하는 데 몇 분(몇 시간은 아니더라도) 많은 귀중한 시간을 소비할 수 있습니다.
여기서 고려해야 할 유일한 사항은 루프 블록 i==x 이후에
for(...){} 이후의 Array[i]는 배열 범위를 벗어난 오류를 반환하고 그게 전부입니다.
말해봐, 그렇지 않으면 내가 지체되기 시작했어)
다음과 같은 디자인이 있습니다.
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를 찾는 방법은 그림자가 아닌 바디로, 그림을 첨부합니다.
말해봐, 그렇지 않으면 내가 지체되기 시작했어)
다음과 같은 디자인이 있습니다.
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])의 하단을 검색해야 합니다.
즉, High / Low를 찾는 두 줄 대신 루프에서 반복을 수행하려면?
HighRange = iHigh (기호, 0 , iHighest (기호, 0 , MODE_HIGH , RangeBar, 1 ));
LowRange = iLow (기호, 0 , iLowest (기호, 0 , MODE_LOW , RangeBar, 1 ));인디케이터가 아니라 어드바이저에 필요한 기능이고 어드바이저에서 제대로 작동하는데 바디별로 범위를 찾는 방법을 모르겠습니다.
즉, 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);
}
//+------------------------------------------------------------------+
테스트 스크립트를 게시했습니다. 부정확성이있을 수 있습니다 - "무릎에"라고 썼습니다. 당신이 그것을 알아 내기 바랍니다.
//| sFindRangeByCandlesBody.mq4 |
//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//| https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
감사합니다. 잘 작동합니다!
추신. 나는 이것이 다섯 번째에서 작동한다는 것을 이해합니까?
감사합니다. 잘 작동합니다!
추신. 나는 이것이 다섯 번째에서 작동한다는 것을 이해합니까?
{
//+--------------------------------------------------------------------+
//| -= 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에게 미안하지만 이 문제에 대한 해결책을 좀 더 간단하게 보여주고 싶습니다.
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에서 모두 동일합니다.
Artyom에게 미안하지만 이 문제에 대한 해결책을 좀 더 간단하게 보여주고 싶습니다.
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위 안에는 이력 데이터가 부족해 처음에는 데이터가 채워지지 않는 경우가 많다.
추신. 더 많이 자야합니다. 그 방향의 생각이 효과가 있을 것입니다.