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

 
Alexey Viktorov :

글쎄, 나는 당신의 교육에 내 진드기를 추가하려고 노력할 것입니다.

보내면 연락드리겠습니다. 포인터의 스냅 샷이 있습니다 ...

한 틱에 한 함수를 5번 호출하는 것이 잘못된 것 같지 않나요? 그러나 그것은 절반의 문제입니다. 이 함수는 모든 주문을 반복합니다. 그리고 이 모든 것을 한 틱에 5번... 그리고 나는 그런 기능을 4개 세었습니다. 모든 주문을 열거하는 주기로 한 주기에 3개의 기능을 더 추가하는 것은 뇌에 부담을 주지 않습니다.

여기 두 가지가 있습니다.

이것은

후행도 다가오지 않습니다.

이것을 이해하려면 후행이 무엇인지에 대한 정의를 명확하게 이해해야 합니다. 나는 그대로 기억하지 못하지만 다음과 같은 것입니다. "가능한 손실을 줄이거나 "보장된" 이익을 늘리기 위해 가격에 따라 StopLoss 수준을 이동합니다."

하지만 이것은

EA가 출시되면 어떤 모습인가요? 아마도 4줄... 필요한가요?

그리고 오늘의 마지막 사항은 머리 속에 라이브러리가 필요하지 않다는 것입니다. 문서가 있고 사용할 수 있으면 충분합니다. 나는 여전히 메모리에 대한 모든 iMA(_Symbol, _Period, , ,,,,) 매개변수를 기록할 수 없으며 문서를 본 후에야 추가로 씁니다. 거의 모든 기능이 그렇습니다. 그러나 다행스럽게도 얼마 전에 그들은 많이 절약되지 않는 툴팁을 만들었습니다. 특정 열거형이 어떻게 작성되었는지 기억하려고 하지 않습니다. 따라서 매번 문서로 이동해야 합니다.


Alexey, 정보 감사합니다. 예, 코드가 최적이 아니라는 것을 인정합니다. 저는 프로그래머가 아니며 귀하가 말한 미묘함을 여전히 모릅니다. 그러한 뉘앙스는 나에게 단순히 이해할 수 없습니다. 모든 것을 최적화하는 방법이 명확하지 않습니다. 아마도 나중에 계속 진행하면 언젠가는 끝낼 것입니다. 이제 나는 최적화를 시작하면 모든 것을 깨뜨릴 것이라는 것을 확실히 알고 있습니다. 글쎄, 이것들은 초보자 코더를 위한 MT4 비용입니다. 비록 제가 여기 사이트에서 다른 조언자들의 코드를 보았지만 - 일반적으로 너무 많은 것들이 있습니다! - 물론, 프로가 코딩했다면 그의 코드가 나보다 터미널을 덜 로드할 수 있지만, 물론 그렇습니다. 하지만 지금까지는 프로그래밍의 이러한 미묘함을 확실히 이해하지 못하기 때문에 귀하의 의견을 고려할 수 없습니다. 최적화. 그리고 코드에서 함수에 대한 호출 중 일부를 제거하면 EA는 반드시 혼란을 일으키기 시작하고 필요하지 않을 때 주문을 열기 시작할 것입니다. 나는 거기에서 코딩하고 테스트했습니다. 아무 것도 잘못되거나 잘못되지 않고 수정했습니다. 결과적으로 최종 코드는 다음과 같이 나타났습니다. 제 지식의 수하물로 이해하는 것처럼 더 이상 최적화를 할 수 없었습니다.

후행에 대해 - 가장 중요한 것은 이익을 추적한다는 것입니다. 이 개발 단계에서 저에게 적합합니다.))) 그리고 결국 이전 및 새 후행 코드는 동일한 방식으로 추적되고 트랜잭션 수 는 동일합니다. 후행이 밝혀졌지만 어쨌든 후행이 작동해야 하는 환경에서 올바르게 수행하는 방법은 아무도 말하지 않으며 이 문제에 대해서도 생각이 없습니다. 내 코드는 모두 LEGO 생성자입니다. 즉, 비디오 자습서의 자료에서. 음, 물론, 약간의 내 것이 있습니다. 이것은 실제로 고문의 알고리즘 자체이며 모든 코드와 기능은 내 발명품이 아니지만 TradeLikeaPro의 비디오 자습서에서 유추하여 정확하게 코드를 "편집"했습니다. 내 요구 사항 - 내 알고리즘. 결국, 무슨 일이 일어났는지 밝혀졌습니다.

 
geratdc : 내 모든 코드는 LEGO 생성자입니다. 즉, TradeLikeaPro를 사용하여 비디오 자습서의 자료에서 컴파일했으며 내 알고리즘에 대한 유추와 필요에 따라 코드를 "편집"했습니다. 결국, 무슨 일이 일어났는지 밝혀졌습니다.

입금 일정을 보니 관심이 생겨 첫 번째 버전을 다운로드했습니다. MetaEdit에서 복사했습니다. 두 가지 경고. 첫 번째 것은 int timeprev=0을 대체하여 제거되었습니다. 날짜 시간에 timeprev=0; 결국 이 변수 날짜에. 두 번째는 다음을 가리킨다.

tp=TakeProfit;             // В переменную tp заносится значение переменной TakeProfit
if(tp>TakeProfit)          // А тут они сравниваются. А с чего им быть разными, если только что уравняли?
{
   TakeProfit+=tp;
}

마지막 세 줄을 삭제했습니다. 깨끗하게 전달합니다. 더 가자...

 //| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   if ( Digits == 3 || Digits == 5 )  // После этой строки нужны фигурные скобки.
      TakeProfit     *= 10 ;        // иначе эта строка будет выполняться по условию

      // а следующие строки будут выполняться всегда
      Step           *= 10 ;
      TrailingStep   *= 10 ;
      TrailingStop   *= 10 ;
      Slippage       *= 10 ;

      
   return ( INIT_SUCCEEDED );
  }

다음과 같이 리메이크(설명을 위해 스크립트 첨부 - 실행, 설명)

 //| Инициализация на пятизнак или иену                               |
//+------------------------------------------------------------------+
void OnInit ()
{
   if ( Digits == 3 || Digits == 5 )
   {
      TakeProfit     *= 10 ;
      Step           *= 10 ;
      TrailingStep   *= 10 ;
      TrailingStop   *= 10 ;
      Slippage       *= 10 ;
   }
}
 //+-------------------------------------------------------+
//| Демонстрация назначения фигурных скобок      PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart ()
{
   // Без фигурных скобок
   if ( 2 == 5 )
     Alert ( "Это сообщение будет пропущено" );
     Alert ( "Без фигурных скобок это сообщается, хотя по логике зря" );

   Alert ( "-------------------------------" );
   Alert ( "А вот со скобками - полный молчок" );
   if ( 2 == 5 )
  {
     Alert ( "Это сообщение будет пропущено" );
     Alert ( "Со скобками это тоже пропускается" );
  }
}
여기 결과가 있습니다


이 함수를 삭제했습니다. 호출이 없고 본문이 비어 있습니다.

 //+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }

실행을 시도하고 보았다:

그것은

변경함으로써 - 글쎄요, 방금 코멘트를 추가하고 Magic에서 extern을 제거했습니다 - 우리는 고문이 동일한 도구와 Slippage를 가진 두 개의 차트에서 시작될 때만 변경합니다 - 왜 이 매개변수를 변경합니까? 그런 다음 생각하고 매개 변수를 10 배 늘렸습니다. 그리고 OnInit 기능이 제거되었습니다. 결국 나는 5개의 표지판만 사용합니다. 왜요? 예, 4자리 스프레드에서 3포인트가 나오면 30이 됩니다. 그리고 5자리 스프레드에서는 12만

그래서 더 명확해졌다

 extern double   Lots           = 0.01 ;   // Размер лота
extern int      TakeProfit     = 5 0;    // Ограничение прибыли Take Profit
extern int      Step           = 2 0;    // Шаг - чего, выясним позже

extern int      TrailingStep   = 3 0;    // Шаг трала
extern int      TrailingStop   = 10 ;    // Ограничение убытка

extern int      MaPeriod       = 200 ;   // Период МА (надо поменьше?)
extern int      MaShift        = 1 ;     // Сдвиг МА (взял бы 0)

       int      Magic          = 123 ;   // Магик - нужен ли он?
       int      Slippage       = 50 ;    // Проскальзывание

datetime timeprev= 0 ;

double price,op,cn,tp;  // Убрал extern

모자의 윗부분을 잘라냅니다. 남은 것은 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                      -Э-1111.mq4 |
//+------------------------------------------------------------------+
#property strict

여기이 라인이 있습니다

   op=CalculateProfit();
   if (CalculateProfit()>=tp) CloseAll();

수요가 있는 곳으로 이동했습니다. 이렇게 생겼습니다

   op=CalculateProfit();
   if (op>=tp)
   {
         CloseAll();    
   }

그런 다음 맨 처음에 op 변수에 대한 설명을 버리고 다음과 같이 대체했습니다.

   if (CalculateProfit()>=tp) CloseAll();

OnTick 함수의 시작 부분에 몇 줄이 있습니다. 이것은 처리가 매 틱 대신 각 막대에 대해 1회만 수행되도록 하기 위한 것입니다.

   if (timeprev == Time [ 0 ]) return ;   // сравнить  время начала последнего бара с временем обработанного бара. Если равны, то выход
   timeprev = Time [ 0 ];               // Запомнить время начала следующего бара      На часовом и далее это будет слабо

다음으로 MA가 계산됩니다. 여기에서 더 자세히 공부해야합니다. 이를 위해 스크립트를 작성하고 결과를 표시했습니다.

   double maprice= iMA ( Symbol (), 0 ,MaPeriod,MaShift, MODE_SMA , PRICE_CLOSE , 1 );
 //+-------------------------------------------------------+
//| Проверка функции iMA                         PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart ()
{
   int MaPeriod= 200 ;
   int MaShift= 1 ;

   Alert ( "MaShift = " , MaShift);
   for ( int Бар= 0 ; Бар< 5 ; Бар++)
   Alert ( "Бар = " , Бар, "   Ma = " ,
     iMA ( Symbol (), 0 ,MaPeriod,MaShift, MODE_SMA , PRICE_CLOSE ,Бар));

   Alert ( "-------------------------" );
  MaShift= 0 ;
   Alert ( "MaShift = " , MaShift);
   for ( int Бар= 0 ; Бар< 5 ; Бар++)
   Alert ( "Бар = " , Бар, "   Ma = " ,
     iMA ( Symbol (), 0 ,MaPeriod,MaShift, MODE_SMA , PRICE_CLOSE ,Бар));
} 

MaShift의 네 번째 매개변수와 마지막 매개변수가 합산된 것을 알 수 있습니다. 막대 번호 = 합계. MA는 끝에서 세 번째 마디 2에서 가져옵니다.

나는 더 볼 것이다. 관심 있는?

 
STARIJ :
...

나는 더 볼 것이다. 관심 있는?

계속해서 화제를 불러일으키는 건가요?

이미 충분합니다. 사람들은 관심이 있는 주제를 따르지만 헛되이 제기됩니다.

누군가가 당신에게 대답하기를 원한다면 그 주제로 전화하십시오. 이렇게: @STARIJ . 그러나 마지막 게시물을 편집하여 주제를 지속적으로 제기할 필요는 없습니다.


 
Victor Nikolaev :

그래서 누군가는 운이 좋지 않습니다. 다시. 이것은 고문이나 지표가 아닌 스크립트입니다.

나는 그것을 알아 냈습니다 - 분명히 터미널에 충분한 메모리가 없었습니다 - 몇 개의 차트를 닫았고 작동했습니다.

감사합니다. 실제로 계산이 진행되고 있습니다.

그리고 변수가 int 유형이 아니라 bool 이면 어떻게 해야 합니까?

 

안녕하세요, 알려주세요:

1 - 등록은 개인으로만 하거나 법인으로도 가능하며 제한사항 및 조건이 있나요?

2 - 하나의 계정(로그인 및 비밀번호)을 갖도록 소셜 네트워크와 동기화합니까?

3 - "페이지에 위젯을 추가하고 신호를 공유하세요"라는 기능도 봤습니다.


 
안녕하세요. 나는 아주 최근에 Mql4를 배우기 시작했습니다. 질문을 엉뚱한 곳에 질문했다면 올바른 주제로 안내해 주세요. 그리고 문제는 다양한 영역, 직사각형 등을 만드는 표시기로 작업하는 방법을 알려주십시오. iCustom을 사용하여 선의 교차점을 약간 프로그래밍하거나 가격이 더 낮을 수 있습니다. MA) 아래 표시기를 첨부했습니다. 버퍼는 4개뿐이고 8가지 종류의 구역이 있습니다. 그리고 이제 실제로 코드를 작성하는 방법, 전화를 끊거나 이러한 영역을 돌파하는 방법을 전혀 알 수 없습니다.
 
STARIJ :

입금 일정을 보니 관심이 생겨 첫 번째 버전을 다운로드했습니다. MetaEdit에서 복사했습니다. 두 가지 경고. 첫 번째 것은 int timeprev=0을 대체하여 제거되었습니다. 날짜 시간에 timeprev=0; 결국이 가변 날짜. 두 번째는 다음을 가리킨다.

*

답변

아마도 이것은 영상 튜토리얼에서 Take 이익이 int형이었고, 나는 그것을 double로 변경했기 때문에 int timeprev 코드의 이전 작성이 그대로 남아 있기 때문일 것입니다. 알겠습니다. 이 문제를 해결하겠습니다. 하지만 일반적으로 이것이 고문의 작업에 어떤 영향을 미칩니까? 사실, 이 막대와 시간은 비디오 자습서의 TrailingStop 기능과 관련이 있었지만 이 기능을 내 것으로 교체했기 때문에 단순히 소스 코드의 유물로 남아 있었고 사실 내 후행은 바의 시간.


마지막 세 줄을 삭제했습니다. 깨끗하게 전달합니다. 더 가자...

다음과 같이 리메이크(설명을 위해 스크립트 첨부 - 실행, 설명)

여기 결과가 있습니다

*답변

이 코드 조각은 어디로 갔습니까?

    return ( INIT_SUCCEEDED );
  }

아마 이렇게 되어야 하지 않을까요?


무효 OnInit()

{

if(숫자 == 3 || 숫자 == 5)

{

단계 *= 10;

후행 단계 *= 10;

후행 정지 *= 10;

미끄러짐 *= 10;

}

반환(INIT_SUCCESSED);

}

TakeProfit을 왜 int형으로 했는지, 이익이 포인트가 된다는 뜻이고, CalculateProfit() 함수가 double형이기 때문에 TakeProfit을 동일하게 하여 일관성을 유지하도록 했습니다.


이 함수를 삭제했습니다. 호출이 없고 본문이 비어 있습니다.

*

답변

코드에 그런 함수가 있습니다 void CloseAll() 이 함수와 어떻게든 연결되어 있다고 생각했습니다

 //+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }

*

답변

좋아, 삭제하자.


실행을 시도하고 보았다:

그것은

변경하여 - 글쎄, 방금 주석을 추가하고 Magic에서 extern을 제거했습니다.

*

답변

예, Slippage와 같이 전혀 변경하지 않았기 때문에 extern은 불필요합니다. 모두 비디오 자습서의 소스 코드에서 가져왔습니다.

- 동일한 장비와 Slippage로 두 개의 차트에서 Expert Advisor를 시작할 때만 변경합니다. - 이 매개변수를 변경하는 이유는 무엇입니까? 그런 다음 생각하고 매개 변수를 10배 늘렸습니다. 그리고 OnInit 기능이 제거되었습니다. 결국, 나는 다섯 개의 표지판만을 사용합니다. 왜요? 예, 4자리 스프레드에서 3포인트가 나오면 30이 됩니다. 그리고 5자리 스프레드에서는 12만

*

답변

따라서 기본적으로 고문은 모든 통화에 대해 작업하는 것으로 간주되었습니다. 나는 나 자신을 위해 Oninit()를 유지할 것이다.

그래서 더 명확해졌다

모자의 윗부분을 잘라냅니다. 남은 것은 다음과 같습니다.

*

답변

이 헤더는 기본적으로 편집기에서 만듭니다. 내 자리에 그대로 두겠습니다. 그렇지 않으면 이러한 회선이 없기 때문에 브로커나 터미널에서 무언가가 미끄러지지 않습니다.

여기이 라인이 있습니다

수요가 있는 곳으로 이동했습니다. 이렇게 밝혀졌습니다.

그런 다음 맨 처음에 op 변수에 대한 설명을 버리고 다음과 같이 대체했습니다.

*

답변

기본적으로 논리적입니다.



OnTick 함수 시작 부분에 몇 줄이 있습니다. 매 틱이 아닌 각 막대에 대해 1회만 처리가 수행되도록 하기 위한 것입니다.

다음으로 MA가 계산됩니다. 여기에서 더 자세히 공부해야합니다. 이를 위해 스크립트를 작성하고 결과를 표시했습니다.


MaShift의 네 번째 매개변수와 마지막 매개변수가 합산된 것을 알 수 있습니다. 막대 번호 = 합계. MA는 끝에서 세 번째 마디 2에서 가져옵니다.

*

답변

내 후행이 변경되었다는 사실 때문에 이동 평균 데이터 시간은 관련이 없다고 생각합니다. 이것은 소스 코드의 유물이며 마지막 3개(3개)의 공개 주문을 추적하려고 했습니다. 사실은 내 고문이 주문을 열고 시장이 STep의 값만큼 잘못된 방향으로 갔다면 고문이 반대 주문을 열고 시장이 계속 반대 방향으로 가면 세 번째 주문이 추가된다는 것입니다. 두 번째 위치의 주문 유형 또는 그 반대의 경우 가격이 방향을 반환하면 세 번째 주문이 첫 번째 주문 유형(구매 또는 판매)으로 열릴 것입니다. 거기에서 후행은 CalculateProfit() 함수를 통해 3개의 주문으로 진행됩니다. 그러나 첫 번째 주문이 성공적으로 열렸고 가격이 예상대로 움직인다면 이러한 상황에서 datetime을 통해 막대를 추적하는 것과 같을 것이고 비디오 강의에서 했을 것입니다. 계산 이익() 함수

나는 더 볼 것이다. 관심 있는?

*

답변

예, 트롤에 대해 질문이 있습니다. 트롤링하는 것 같지만 아무도 내가 그곳에서 그와 바람을 피운 것에 대해 탐구하기를 꺼려하지 않습니다. 막대 및 날짜 시간 작동과는 별도로 후행 - 이들은 Trailing() 함수입니다.

MA 기간에 대해 - 200으로 표시했지만 요점은 이것이 나에게 맞춤 값이라는 것입니다. 그리고 키 매개변수 값이 누락된 것 같습니다. 거기에 README 파일 설명에서 의미를 설명했습니다.



이 모든 것을 올려주셔서 감사합니다. Expert Advisor는 실제로 너무 기계적입니다. 그러나 원칙적으로 작업을 설정하고 때때로 제어하면 완전히 아무것도 될 수 없습니다. 시간이 말해 줄거야. 그는 아마도 뭔가를 벌 수 있을 것입니다. 하지만 그는 눈을 깜박이지 않고 문자 메시지조차 보내지 않을 것입니다. - 나는 이것에 신경 쓰지 않았습니다. 예금이 발생했습니다. 이것은 3개의 주문이 이미 열려 있고 시장의 반동이 사라졌음을 의미합니다. 그런 상황에서는 등유 냄새가 납니다. 다른 모든 고문은 거래 상품의 차트 동작 기록으로 설정되어 있으면 해결됩니다.


메모장에 있는 동안 권장되는(전부는 아님) 코드를 변경했습니다. 코드를 올바르게 수정했는지 확인하십시오.

나는 최적화를위한 것이지만 oninit을 삭제 한 순간을 고려하지 않았습니다. 모든 통화에서 테스트하고 작업 할 수 있도록 필요합니다)))

 
Aleksandr Verkhozin :
안녕하세요. 나는 아주 최근에 Mql4를 배우기 시작했습니다. 질문을 엉뚱한 곳에 질문했다면 올바른 주제로 안내해 주세요. 그리고 문제는 다양한 영역, 직사각형 등을 만드는 표시기로 작업하는 방법을 알려주십시오. iCustom을 사용하여 선의 교차점을 약간 프로그래밍하거나 가격이 더 낮을 수 있습니다. MA) 아래 표시기를 첨부했습니다. 버퍼는 4개뿐이며 8가지 종류의 구역이 있습니다. 그리고 이제 실제로 코드를 작성하는 방법, 전화를 끊거나 이러한 영역을 돌파하는 방법을 전혀 알 수 없습니다.

TradeLikeApro의 rutracker 수업에서 Yandex 다운로드 토런트 비디오 자습서 프로그래밍 mql4를 입력하십시오. 일반적인 프로그래밍 예제가 없으면 무엇이 무엇인지 이해하기 어렵습니다. 방금 비디오 자습서를 보았지만 바보였기 때문에 이 비즈니스에 남아 있었습니다.))) 아마도 당신이 발전할 것입니다.
 

geratdc :

...
예, 트롤에 대해 질문이 있습니다. 트롤링을 하는 것 같지만, 내가 그곳에서 그와 함께 망쳐놓은 무언가에 대해 탐구하는 것을 꺼려하는 사람은 아무도 없습니다.

...

알다시피, 바로 이 스레드에서 계산에 전달된 지표 값을 사용하는 트롤용 템플릿을 게시했습니다. 검색, 게으르지 마십시오.
 
geratdc :

TradeLikeApro의 rutracker 수업에서 Yandex 다운로드 토런트 비디오 자습서 프로그래밍 mql4를 입력하십시오. 일반적인 프로그래밍 예제가 없으면 무엇이 무엇인지 이해하기 어렵습니다. 방금 비디오 자습서를 보았지만 바보였기 때문에 이 비즈니스에 남아 있었습니다.))) 아마도 당신이 발전할 것입니다.


외부 표시기로 작업하는 방법에 대한 비디오를 보고 테스터에서 버퍼 값을 보기 위해 작은 코드를 작성했습니다.

무효 OnTick()

{

이중 Buf1=iCustom(NULL,0,"Shved-Supply-and-Demand-e600",0,1);

이중 Buf2=iCustom(NULL,0,"Shved-Supply-and-Demand-e600",1,1);

이중 Buf3=iCustom(NULL,0,"Shved-Supply-and-Demand-e600",2,1);

이중 Buf4=iCustom(NULL,0,"Shved-Supply-and-Demand-e600",3,1);

주석 ("Buf1=",Buf1,"\n", "Buf2=",Buf2,"\n","Buf3=",Buf3,"\n","Buf4=",Buf4);

}

이미징 모드의 영역이 나타났다가 사라집니다. 그리고 버퍼의 값은 모두 동일하며 항상 0입니다. 코드에서 이러한 영역을 공식화하는 것이 정말 불가능합니까?

iCustom 외에 이러한 지표에 적합한 기능이 있습니까? 어쩌면 누군가가 비슷한 지표로 올빼미를 썼습니까?