오류, 버그, 질문 - 페이지 37

 
kirill190982 :
지금은 무시할 가능성이 높지만 컴파일러는 MQL4에서 그런 언급을 하지 않았습니다.
이것은 완전히 다른 질문입니다. 거기에는별로 없었습니다 ... :)
 
Interesting :

변수를 사용하면 모든 것이 정상일 가능성이 큽니다. 위의 제 글을 봐주세요...

double이 int로 캐스트되면 확실히 손실이 있을지 모르겠지만 그 반대 의 경우 int 유형의 함수의 두 번째 값이기 때문에 정규화 중에 오류가 발생할 가능성이 가장 높습니다.
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Interesting :

동일한 터미널에서 작업하는 "맞춤형" 이벤트 및 여러 Expert Advisors에 대한 개발자 질문입니다.

그래서 나는 모든 것을 올바르게 휘젓고 싶은지 묻고 싶습니다.


아이디어는

플레이 과정에서 "이웃" 전문가에게 진행 중인 프로세스에 대해 알려야 합니다.

...

아이디어가 가치가 있는 경우 누군가가 아이디어를 마무리하고 기사 형식으로 발행하는 데 동의할 수 있습니다. 또는 사용자 이벤트 전용 도움말 섹션에 기여하시겠습니까?

EventChartCustom 함수의 예는 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                            ButtonClickExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link       "http://www.mql5.com"
#property version   "1.00"
 
string buttonID= "Button" ;
string labelID= "Info" ;
int broadcastEventID= 5000 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- создадим кнопку, для передачи пользовательских событий
   ObjectCreate ( 0 ,buttonID, OBJ_BUTTON , 0 , 100 , 100 );
   ObjectSetInteger ( 0 ,buttonID, OBJPROP_COLOR , White );
   ObjectSetInteger ( 0 ,buttonID, OBJPROP_BGCOLOR , Gray );
   ObjectSetInteger ( 0 ,buttonID, OBJPROP_XDISTANCE , 100 );
   ObjectSetInteger ( 0 ,buttonID, OBJPROP_YDISTANCE , 100 );
   ObjectSetInteger ( 0 ,buttonID, OBJPROP_XSIZE , 200 );
   ObjectSetInteger ( 0 ,buttonID, OBJPROP_YSIZE , 50 );
   ObjectSetString ( 0 ,buttonID, OBJPROP_FONT , "Arial" );
   ObjectSetString ( 0 ,buttonID, OBJPROP_TEXT , "Кнопка" );
   ObjectSetInteger ( 0 ,buttonID, OBJPROP_FONTSIZE , 10 );
   ObjectSetInteger ( 0 ,buttonID, OBJPROP_SELECTABLE , 0 );
 
//--- создадим метку для вывода информации
   ObjectCreate ( 0 ,labelID, OBJ_LABEL , 0 , 100 , 100 );
   ObjectSetInteger ( 0 ,labelID, OBJPROP_COLOR , Red );
   ObjectSetInteger ( 0 ,labelID, OBJPROP_XDISTANCE , 100 );
   ObjectSetInteger ( 0 ,labelID, OBJPROP_YDISTANCE , 50 );
   ObjectSetString ( 0 ,labelID, OBJPROP_FONT , "Trebuchet MS" );
   ObjectSetString ( 0 ,labelID, OBJPROP_TEXT , "Нет информации" );
   ObjectSetInteger ( 0 ,labelID, OBJPROP_FONTSIZE , 20 );
   ObjectSetInteger ( 0 ,labelID, OBJPROP_SELECTABLE , 0 );
 
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   ObjectDelete ( 0 ,buttonID);
   ObjectDelete ( 0 ,labelID);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
 
  }
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if (id== CHARTEVENT_OBJECT_CLICK )
     {
       string clickedChartObject=sparam;
       //--- если нажатие на объекте с именем buttonID
       if (clickedChartObject==buttonID)
        {
         //--- состояние кнопки - нажата кнопка или нет
         bool selected= ObjectGetInteger ( 0 ,buttonID, OBJPROP_STATE );
         //--- выведем в лог отладочное сообщение
         Print ( "Кнопка нажата =" ,selected);
         int customEventID; // номер пользовательского события для отправки
         string message;     // сообщение для отправки в событии
         //--- если кнопка нажата
         if (selected)
           {
            message= "Кнопка нажата" ;
            customEventID= CHARTEVENT_CUSTOM + 1 ;
           }
         else // кнопка не нажата
           {
            message= "Кнопка отжата" ;
            customEventID= CHARTEVENT_CUSTOM + 999 ;
           }
         //--- отправим пользовательское событие "своему"графику
         EventChartCustom ( 0 ,customEventID- CHARTEVENT_CUSTOM , 0 , 0 ,message);
         //--- отправим сообщение всем открытым графикам
         BroadcastEvent( ChartID (), 0 , "Broadcast Message" );
         //--- отладочное сообщение
         Print ( "Отправлено событие с ID =" ,customEventID);
        }
       ChartRedraw (); // принудительно перерисуем все объекты на графике
     }
 
//--- проверим событие на принадлежность к пользовательским событиям
   if (id> CHARTEVENT_CUSTOM )
     {
       if (id==broadcastEventID)
        {
         Print ( "Получили широковещательное сообщение от графика с id=" +lparam);
        }
       else
        {
         //--- прочитаем текстовое сообщение в событии
         string info=sparam;
         Print ( "Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID =" ,id);
         //--- выведем сообщение в метке
         ObjectSetString ( 0 ,labelID, OBJPROP_TEXT ,sparam);
         ChartRedraw (); // принудительно перерисуем все объекты на графике
        }
     }
  }
//+------------------------------------------------------------------+
//| послать широковещательное сообщение всем открытм графикам        |
//+------------------------------------------------------------------+
void BroadcastEvent( long lparam, double dparam, string sparam)
  {
   int eventID=broadcastEventID- CHARTEVENT_CUSTOM ;
   long currChart= ChartFirst ();
   int i= 0 ;
   while (i< CHARTS_MAX )           // у нас наверняка не больше CHARTS_MAX открытых графиков
     {
       EventChartCustom (currChart,eventID,lparam,dparam,sparam);
      currChart= ChartNext (currChart); // на основании предыдущего получим новый график
       if (currChart== 0 ) break ;   // достигли конца списка графиков
      i++;                     // не забудем увеличить счетчик
     }
  }
//+------------------------------------------------------------------+

시도 해봐.

 
kirill190982 :
double이 int로 캐스트되면 확실히 손실이 있을지 모르겠지만 그 반대 의 경우 int 유형의 함수의 두 번째 값이기 때문에 정규화 중에 오류가 발생할 가능성이 가장 높습니다.

intdouble 에 쓰면 모든 것이 정상적으로 처리되고 컴파일러는 (규칙에 따라) 소수 부분만 버립니다.

반대 상황에서 컴파일러는 의심하기 시작하고 가능한 문제에 대한 경고를 발행합니다(그가 보기에).

그리고 우리는 비슷한 상황에서 침례를 받아야 할 필요가 있을 때 침례를 받도록 "권고"한다는 것을 모두 알고 있습니다. :)

추신

아마도 개발자는 미래에 일부 경고를 비활성화하고 MQL4에서와 같이 컴파일러가 모든 작은 것에 대한 저주를 중단할 것입니다...

 
Interesting :

동일한 터미널에서 작업하는 "맞춤형" 이벤트 및 여러 Expert Advisors에 대한 개발자 질문입니다.

그래서 나는 모든 것을 올바르게 휘젓고 싶은지 묻고 싶습니다.


아이디어는

플레이 과정에서 "이웃" 전문가에게 진행 중인 프로세스에 대해 알려야 합니다.

예를 들어, 이러한 프로세스를 먼저 추적해야 합니다.

1. Zapsk 전문가;

2. 전문가 고문을 내리기;

3. 매매거래의 종료

4. 거래 재개.


구현

I. 4개의 이벤트 ID 생성:

하나 - CHARTEVENT_CUSTOM +1 //전문가 고문 시작

2 - CHARTEVENT_CUSTOM +2 //전문가 언로드

3 - CHARTEVENT_CUSTOM +3 //거래 작업 종료

4 - CHARTEVENT_CUSTOM +4 //거래 재개


Ⅱ. 이벤트 추적

Expert Advisor에서 특정 상황이 발생하면 다음을 사용하여 BROADCAST 메시지가 생성됩니다. 이벤트 차트 사용자 지정 .

동시에 EA는 sparam (이름 및 이벤트 유형, 기타 정보) 및 lparam 차트의 식별자에 대한 설명을 작성합니다.

다른 차트의 전문가(이벤트의 특성을 올바르게 분석할 수 있는 경우)는 이 특정 전문가에게 응답합니다.


추신

아이디어가 가치가 있는 경우 누군가가 아이디어를 마무리하고 기사 형식으로 발행하는 데 동의할 수 있습니다. 또는 사용자 이벤트 전용 도움말 섹션에 기여하시겠습니까?

그리고 한 번에 여러 어드바이저를 사용할 이유가 없습니다. 특히 여러 악기로 연주하는 경우 한 명의 전문가가 쉽게 수정할 수 있습니다. 수정, 열기 및 닫기도 한 전문가가 수행할 수 있으며 지표 분석도 가능합니다.
 
Rosh :

EventChartCustom 함수의 예는 다음과 같습니다.

시도 해봐.

네, 저는 이 예를 아직 봤습니다(얼마 전인지조차 모릅니다). 구현의 관점에서 내 아이디어가 얼마나 정확하고 흥미로운지 묻고 싶었습니다.

추신

인증서에 맞지 않으면 누군가가 인증서를 마무리하고 이러한 이벤트 적용에 대한 기사를 작성하는 데 동의할 것입니다.

한 전문가에서 다른 전문가(또는 다른 전문가)에게 주문 형식으로 사용자 지정 이벤트를 사용하는 것도 흥미로울 것입니다. 이 모든 것이 요약되면 제 생각에는 매우 흥미로운 기사가 될 것입니다.

불행히도 나는 이것을 할 시간이 없습니다 ...

 
kirill190982 :
그리고 한 번에 여러 어드바이저를 사용할 이유가 없습니다. 특히 여러 악기로 연주하는 경우 한 명의 전문가가 쉽게 수정할 수 있습니다. 수정, 열기 및 닫기도 한 전문가가 수행할 수 있으며 지표 분석도 가능합니다.

특히 모든 Expert Advisors가 선험적 다중 통화(MQL4 경험 기반)가 아니기 때문에 항상 의미가 있습니다.

이것은 초보자와 이전에 기계 거래 문제를 다루었던 많은 사람들이 다중 통화 거래를 올바르게 구성하는 것이 쉽지 않을 것임을 의미합니다...


개발자 자신은 아직 일반적인 다중 통화를 예로 들 수 없습니다. 누군가가 하나의 계정에서 MACD 샘플 의 2-3개 복사본을 실행하기를 원하면 어떻게 될까요? 오직 신만이 알고 있습니다.


또한 상황이 다르며 다른 전문가는 첫 번째 명령을받는 보조 역할 만 수행합니다.

또한 이 옵션은 다른 전문가("이웃")가 거래 작업 을 수행하지 않고 데이터를 처리하거나 특정 작업만 수행하는 경우 허용됩니다.

또한 칠면조 및 전문가와 의사 소통 할 때도 비슷한 것들이 구현 될 수 있습니다 (특정 접근 방식으로).

추신

그렇기 때문에 이 문제에 대해 작업하고 숙련된 프로그래머가 기사를 작성하고 싶어하는 경우 제안했습니다. 개발자들이 이 문제에 시간을 할애한다면 특히 기쁠 것입니다.

원하는 경우 하나 이상의 기사에 대한 자료가있을 것이라고 생각합니다 ...

 
Interesting :
............

불행히도 나는 이것을 할 시간이 없습니다 ...

우리는 이해한다. 모든 사람과 모든 것에 대해 너무 많은 시간을 낭비했습니다.
 
AM2 :

vMA와 Close[]의 값을 보고 있습니다. 시계에서는 모든 것이 정상입니다. 또한 이것을 시도했습니다.

다시 오류를 씁니다. 다른 방법으로 단순 이동 평균을 계산할 수 있습니다. 아니면 필요한 곳에 iMA 핸들과 CopyBuffer 를 사용하시겠습니까?

1. 시계에서 Close 배열의 이름(일반 정보만 표시됨) 또는 특정 값 Close[1], Close[2],..., Close[i]를 지정해야 합니다.

2. 귀하의 코드에 따르면 mrate 배열이 어떻게 채워지는지 명확하지 않습니다.

3. 표준 라이브러리 MovingAverages.mqh를 참조하십시오 . MA 계산의 예가 있습니다.

 
joo :
우리는 이해한다. 모든 사람과 모든 것에 대해 너무 많은 시간을 낭비했습니다.


또한 의견을 제시하고 특정 아이디어를 구현하기에 충분한 시간이 있을 것입니다.

나는 이 문제를 전체 적용 범위를 다루기 위해 그렇게 심각하게 다루지 않을 것이라는 점을 확신합니다(그리고 나는 이 아이디어를 적용하는 몇 가지 문제를 이미 순전히 나 자신을 위해 다루었습니다).

그러나 어쨌든 나는 (여러 가지 이유로)이 주제에 대한 기사를 쓰지 않을 것입니다 ...