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

 

사이트의 메인 페이지는 텍스트에 HTML 문자를 표시합니다. 크롬 64 윈 10 64.

 

컴파일 오류

 template < typename T>
class A {
public :
        A( T t1 ) : t( t1 ) {}
        T operator []( int ) { return t; }
        T t;
};
typedef void (*fn)();
void OnStart ()
{
        A<fn> a( OnStart );
        a.operator[]( 0 )(); //нормально
        a[            0 ](); // error: ')' - expression expected
}
 

ArrayIsSeries() 는 이 스크립트에서 항상 false를 반환합니다.

 //+------------------------------------------------------------------+
//|                                                     TestCopy.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

enum enumYN
  {
   enYes= 1 , // Да
   enNo= 0 ,   // Нет
  };

//--- input parameters
input int Search_Period= 10 ;   // Количество копируемых свечей
int searchPeriod=(Search_Period< 1 )? 1 :Search_Period;
input int Delta= 2 ;             // Количество пунктов допуска
int delta=(Delta< 0 )? 0 :Delta;
input enumYN AsSeries=enYes;   // Массив array как таймсерия
MqlRates array[];             // Массив структур для копирования Open, High, Low, Close, Time
  
struct DataCandle             // Структура для хранения всех совпадений
  {
   int number_matched;           // Количество совпадений
   MqlRates reference_candle;     // Данные эталонной свечи
   MqlRates matched_candles[];   // Массив свечей, совпадающих с эталонной по нужному критерию 
  };
  DataCandle dataCandle[];     // Массив структур данных свечей и их совпадений
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   int copy_bars=( int ) fmin (Search_Period, Bars ( Symbol (), Period ()));   // количество копируемых свечей
   int copied= CopyRates ( Symbol (), PERIOD_CURRENT , 1 ,copy_bars,array);   // копируем данные
   if (copied> 0 ) {                                                     // если скопировали
       ArraySetAsSeries (array,AsSeries);                               // задаём массив как таймсерию или нет
       ArrayResize (dataCandle,copied);                                 // задаём размер структуры равным числу скопированных данных
       ZeroMemory (dataCandle);                                         // Обнуляем данные в структуре
       //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
       for ( int i= 0 ; i<copy_bars- 1 ; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"
         dataCandle[i].reference_candle.high=array[i].high;           // ищем этот high
         dataCandle[i].reference_candle.low=array[i].low;             // запомнили low для сравнения
         dataCandle[i].reference_candle.time=array[i].time;           // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size= 0 ;                                                 // размер массива совпадающих свечей
         ArrayResize (dataCandle[i].matched_candles,size);             // Размер массива совпадений в ноль
         dataCandle[i].number_matched=size;                           // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for ( int j= 0 ; j<copy_bars; j++) {                             // в цикле от i+1 до copy_bars
             if (j==i) continue ;                                       // пропустим свечу "саму себя"
             //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину Point)
             if ( NormalizeDouble (delta* Point ()- fabs (array[i].high-array[j].high), Digits ())>= 0 ) {
               size++;                                               
               ArrayResize (dataCandle[i].matched_candles,size);             // увеличим размер массива совпадающих свечей
               dataCandle[i].number_matched=size;                           // запишем количество совпадений
               dataCandle[i].matched_candles[size- 1 ].high=array[j].high;   // запишем в массив high совпадающей свечи
               dataCandle[i].matched_candles[size- 1 ].low=array[j].low;     // запишем в массив low совпадающей свечи
               dataCandle[i].matched_candles[size- 1 ].time=array[j].time;   // запишем в массив время совпадающей свечи
               //Print("Время свечи ",i," :",TimeToString(dataCandle[i].reference_candle.time=array[i].time),", high=",DoubleToString(dataCandle[i].reference_candle.high=array[i].high,Digits()),". Совпадение со свечой ",TimeToString(dataCandle[i].matched_candles[size-1].time=array[j].time),", её high ",DoubleToString(dataCandle[i].matched_candles[size-1].high=array[j].high,Digits()),". Совпадений: ",(string)dataCandle[i].number_matched);
               }
            }
         }
      }

   //--- Посмотрим чего понаписали в массивы
   Alert ( "Array is series: " , ArrayIsSeries (array),
         "\ntime array[0]: " , TimeToString (array[ 0 ].time, TIME_DATE | TIME_MINUTES ),
         "\ntime array[" , string (searchPeriod- 1 ), "]: " , TimeToString (array[ ArraySize (array)- 1 ].time, TIME_DATE | TIME_MINUTES ));
   for ( int i= 0 ; i< ArraySize (dataCandle)- 1 ; i++) {
       string refs_txt= "" ;
       string matched_txt= "" ;
      refs_txt= "Свеча " + IntegerToString (i, 2 , '0' )+ ": время " + TimeToString (dataCandle[i].reference_candle.time)+ ", high: " + DoubleToString (dataCandle[i].reference_candle.high, Digits ())+ " имеет совпадений: " +( string )dataCandle[i].number_matched+ " шт. " ;
       if (dataCandle[i].number_matched> 0 ) {
         for ( int j= 0 ; j< ArraySize (dataCandle[i].matched_candles); j++) {
            matched_txt= "Совпадение " + IntegerToString (j+ 1 )+ ": " + TimeToString (dataCandle[i].matched_candles[j].time)+ ", high: " + DoubleToString (dataCandle[i].matched_candles[j].high, Digits ());
            }
         }
       Print (refs_txt,matched_txt);
      }
  }
//+------------------------------------------------------------------+
 
차트 매개변수를 통해 PPI 표시기( 인치당 픽셀 수 )를 찾을 수 있습니까? 내 패널에 매우 유용합니다. WinAPI를 제공하지 마십시오.
 
Andrey Voytenko :
차트 매개변수를 통해 PPI 표시기( 인치당 픽셀 수 )를 찾을 수 있습니까? 내 패널에 매우 유용합니다. WinAPI를 제공하지 마십시오.

공지사항에서 발견:

MQL5: TERMINAL_SCREEN_DPI 값이 클라이언트 터미널 속성의 ENUM_TERMINAL_INFO_INTEGER 열거에 추가되었습니다. 화면에 정보를 표시 하는 해상도는 표면의 선형 인치당 도트 수(DPI)로 측정됩니다. 이 매개변수를 알면 그래픽 개체의 크기를 설정하여 해상도가 다른 모니터에서 동일하게 보이도록 할 수 있습니다.

도움이 될까요?
 
기사를 작성할 때 그림을 삽입하려고 할 때 "그림만" 필터가 없습니다. 그림 과 전혀 관련이 없는 파일이라도 선택한 폴더에 절대적으로 모든 파일이 표시됩니다.
 
Karputov Vladimir :

공지사항에서 찾음: TERMINAL_SCREEN_DPI

도움이 될까요?

예, 필요한 것입니다. 덕분에.
 
지표의 OnChartEvent는 차트에 Expert Advisor를 로드할 때까지 CHARTEVENT_MOUSE_MOVE가 작동하지 않습니다.

오류 도와주세요

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

실수!!! 지표의 OnChartEvent는 차트에 Expert Advisor를 로드할 때까지 CHARTEVENT_MOUSE_MOVE가 작동하지 않습니다.

Vladislav Andruschenko , 2016.05.13 12:29

지표의 OnChartEvent는 차트에 Expert Advisor를 로드할 때까지 CHARTEVENT_MOUSE_MOVE가 작동하지 않습니다.

사실 주제.

2016.05.13 13:23:49.434 Windows 7 Ultimate(x64 기반 PC), IE 11.00, 8 x Intel Core i7-6700 @ 3.40GHz, RAM: 22784 / 32684 Mb, HDD: 16315 / 1498122 Mb, GMT+02:00

그래서.

테스트 지표가 있습니다

최소한의 코드:

 void OnChartEvent ( const int id,

                   const long &lparam,

                   const double &dparam,

                   const string &sparam)

  {

   Comment ( " MOVE \n id=" +id+ " \n lparam=" +lparam+ " \n dparam=" +dparam+ " \n sparam=" +sparam
           );


  }

따라서 차트 에 표시기를 첨부 할 때 - 주석에 마우스 커서의 현재 위치가 표시되지 않으며,

그래프를 클릭하면 마지막 좌표가 표시되고 이동할 때 변경되지 않습니다. 매개변수 CHARTEVENT_MOUSE_MOVE - 이 경우 작동하지 않습니다.

문제는 다음과 같이 해결됩니다.

차트에 전문가를 첨부할 때 표시기는 일반적으로 주석을 업데이트합니다. 즉, 커서를 모니터링하고 좌표를 표시합니다.

나중에 차트에서 Expert Advisor를 제거하더라도 표시기는 일반적으로 커서 좌표를 표시합니다.

절차:

1. 새 차트 열기

2. 테스트 인디케이터를 던진다

3. 댓글 에 CHARTEVENT_MOUSE_MOVE 플래그가 표시되지 않습니다(id =0).

4. 나는 어떤 전문가라도 차트에 던진다

5. 표시기가 CHARTEVENT_MOUSE_MOVE(id = 10) 작업을 정상적으로 표시하기 시작합니다.


 
Vladislav Andruschenko :
지표의 OnChartEvent는 차트에 Expert Advisor를 로드할 때까지 CHARTEVENT_MOUSE_MOVE가 작동하지 않습니다.

오류 도와주세요

개발자가 묻는 첫 번째 질문 - CHART_EVENT_MOUSE_MOVE가 활성화되어 있습니까?
 
Alexander Puzanov :
개발자가 묻는 첫 번째 질문 - CHART_EVENT_MOUSE_MOVE가 활성화되어 있습니까?

고맙습니다. 내가 몰랐던 것. ... ... ... ...