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

 
giannis1386 :

나는 완전히 혼란스럽다.

더블 blevel= OrderStopLoss ()< 입찰 - 포인트 *TS; 나를 위해 작동합니다. SL은 이익으로만 가격을 따릅니다.

이중 slevel= OrderStopLoss ()> 묻기 + 포인트 *TS; 하지만 이것을 다른 것에 추가하는 방법을 모르겠습니다

나는 그들을 bool처럼 가지고 있지 않습니다.

bool은 아니지만 암시적 변환이라고 합니다.

뭐하는거야? 트롤 그물?

 
Artyom Trishkin :

bool은 아니지만 암시적 변환이라고 합니다.

뭐하는거야? 트롤 그물?

예, 트롤을 만들려고 했습니다. 원래 스크립트는 주문에 대한 이익이 도달하면 닫히는 것이었습니다.
 
giannis1386 :
예, 트롤을 만들려고 했습니다. 원래 스크립트는 주문에 대한 이익이 도달하면 닫히는 것이었습니다.
스크립트가 아닙니다 - 고문. 당신은 혼란스러운 프로그램입니다. 스크립트는 차트에 로드된 후 한 번 실행된 후 삭제됩니다. 그가 집착하지 않는다면. 누군가가 포지션을 닫기 위한 루프 스크립트를 만들 가능성은 거의 없습니다.
 
giannis1386 :
예, 트롤을 만들려고 했습니다. 원래 스크립트는 주문에 대한 이익이 도달하면 닫히는 것이었습니다.

논리:

사이클에서 선택된 현재 주문의 이익이 지정된 것보다 크면 그 손절매가 계산된 후행 손절매 수준보다 작거나(매도의 경우)/큰(매도의 경우) 스탑을 새로운 스탑으로 이동 값.

이것은 매우 간략합니다.

 
Artyom Trishkin :
내가 제안한 거 아니야?

예 ... 나는 당신의 코드를 너무 부주의하게 보았기 때문에 전혀 보지 않았다고 말하는 것이 더 낫습니다. 그러나 이것은 바닥입니다. 그런 다음 나는 거의 부끄러운 그런 말도 안되는 소리를 멈췄습니다. 어떤 이유에서인지 ArrayMaximum() 을 구조체 배열이나 이 배열의 별도 필드에 적용할 수 있다는 미친 생각이 갑자기 떠올랐습니다.

나는 고백합니다. 나는 다른 사람에게 그렇게 생각하도록 조언하지 않습니다. 작동하지 않습니다 ... :)

 
Alexey Viktorov :

예 ... 나는 당신의 코드를 너무 부주의하게 보았기 때문에 전혀 보지 않았다고 말하는 것이 더 낫습니다. 그러나 이것은 바닥입니다. 그런 다음 나는 거의 부끄러운 그런 말도 안되는 소리를 멈췄습니다. 어떤 이유에서인지 ArrayMaximum()을 구조체 배열이나 이 배열의 별도 필드에 적용할 수 있다는 미친 생각이 갑자기 떠올랐습니다.

나는 고백합니다. 나는 다른 사람에게 그렇게 생각하도록 조언하지 않습니다. 작동하지 않습니다 ... :)

그럼... 그리고 나는? 같은 방식으로 감사의 인사를 전한 귀하의 코드를 간과했습니다. 그들은 그것이 실제로 더 짧다고 말합니다 ...

요컨대 - 둘 다 농담할만한 가치가 있습니다 ...

 
Artyom Trishkin :
스크립트가 아닙니다 - 고문. 당신은 혼란스러운 프로그램입니다. 스크립트는 차트에 로드된 후 한 번 실행된 후 삭제됩니다. 그가 집착하지 않는다면. 누군가가 포지션을 닫기 위한 루프 스크립트를 만들 가능성은 거의 없습니다.

저자에 따르면:

다음은 약간 수정된 표준 MT4 스크립트입니다. close.mq4

파일을 MetaTrader\experts\Scripts 폴더에 넣고,

 
Artyom Trishkin :

그럼... 그리고 나는? 같은 방식으로 감사의 인사를 전한 귀하의 코드를 간과했습니다. 그들은 그것이 실제로 더 짧다고 말합니다 ...

요컨대 - 둘 다 농담할만한 가치가 있습니다 ...

동의하지 않습니다. 이 코드

   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)]);

테스트하고 작동합니다. 다음은 간단한 사용자 지정 이중 배열이며 CopyRates()는 구조 배열 을 채우므로 배열 함수를 사용하여 최대값과 최소값을 선택할 수 없습니다.

 
giannis1386 :

저자에 따르면:

다음은 약간 수정된 표준 MT4 스크립트입니다. close.mq4

파일을 MetaTrader\experts\Scripts 폴더에 넣고,

이것은 그의 스크립트가 한 번만 작동한다는 것을 의미합니다. 즉, 차트에 올려 놓고 스크립트가 작동하고( 닫힌 위치 ) 언로드됩니다.

그리고 당신은 스크립트가 아니라 고문이 필요합니다.

 
Alexey Viktorov :

동의하지 않습니다. 이 코드

   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)]);

테스트하고 작동합니다. 다음은 간단한 사용자 지정 이중 배열이며 CopyRates()는 구조 배열을 채우므로 배열 함수를 사용하여 최대값과 최소값을 선택할 수 없습니다.

글쎄, 나는 당신에게 말하고 있습니다 - 나는 또한 당신의 코드를 매우 주의 깊게 보았습니다. 그래서 - 나에 대한 농담

추신. 사실, 내 코드는 높음 / 낮음 / 가장 높음 / 가장 낮은 4 가지 값을 반환하고 당신의 것은 높음과 낮음뿐이며 광산은 데이터 복사 성공 (전부는 아니지만)을 확인하지만 당신의 것은 ...

이것은 내 코드가 원하는 데이터의 완전한 복사본을 확인하는 방법입니다.

//+------------------------------------------------------------------+
//|                                      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)==rangeBars) {
       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);
}
//+------------------------------------------------------------------+