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

 
Roman :

인쇄(

예, 그리고 printf는 다음과 같이 이행합니다.
printf 에서 첫 번째 매개변수는 출력 값의 유형입니다.


인쇄 작업! 고맙습니다! ))

그러나 printf가 항상 그런 것은 아닙니다.


 

캔버스에 한 문자를 표시하고 이동하고 싶습니다. 출처:

 #property indicator_chart_window
#property indicator_plots 0

#include <Canvas\Canvas.mqh>


CCanvas canvas;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
{
   canvas.CreateBitmapLabel( ChartID (), 0 , "canvas" , 0 , 0 , 900 , 400 );
   canvas.FontSet( "Courier New" , 32 );
   canvas.Erase( 0 );
   canvas.Update();
   EventSetMillisecondTimer ( 250 );
//---
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
{
//---

//--- return value of prev_calculated for next call
   return (rates_total);
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
{
   static int x = 0 ;
   static const uint col_black = ColorToARGB ( clrBlack );
   static const uint col_red = ColorToARGB ( clrRed );
   canvas. TextOut (x, 100 , "S" , col_black);
   x+= 10 ;
   canvas. TextOut (x, 100 , "S" , col_red);
   canvas.Update();
}
//+------------------------------------------------------------------+


이전 렌더링된 이미지를 black 으로 덮어쓰는데 왜 아티팩트가 남아 있습니까?


 
Igor Makanu :

캔버스에 한 문자를 표시하고 이동하고 싶습니다. 출처:


이전 렌더링된 이미지를 black 으로 덮어쓰는데 왜 아티팩트가 남아 있습니까?


전체 캔버스를 한 번에 다시 업로드하는 것이 좋습니다. 모두 동일하면 모두 다시 그려집니다.

 
Andrey Barinov :

전체 캔버스를 한 번에 다시 업로드하는 것이 좋습니다. 모두 동일하면 모두 다시 그려집니다.

나는 이미 이것을 생각했지만 그 질문은 순전히 기술적인 것입니다

글꼴 다듬기가 그렇게 작동하는 것으로 밝혀진 것 같습니까? 목표는 스프라이트를 움직이는 것입니다. 일반적으로 왜 이렇게 작동하는지 알고 싶습니다.

 

어디를 파야할지 모르겠는데 검색 방향을 알려주실 분 계신가요? 인디케이터를 쓰고 있는데 '컴파일'을 처음 클릭하면 계산 부분이 엉뚱한 소리를 내며 다시 컴파일을 해보니 맞는 것 같다.

 2020.07 . 13 14 : 12 : 05.987 ZigZag_MP (USDJPY,M15)  Average wave size = - 2147483648 points; less then average: 1 / 100 min= 99999999.0 max= 107.1 steps=- 2147483648
2020.07 . 13 14 : 12 : 27.179 ZigZag_MP (USDJPY,M15)  Average wave size = 273 points; less then average: 65 / 100 min= 106.422 max= 107.848 steps= 57

2020.07 . 13 14 : 18 : 38.001 ZigZag_MP (USDJPY,M15)  Average wave size = - 2147483648 points; less then average: 1 / 100 min= 99999999.0 max= 107.1 steps=- 2147483648
2020.07 . 13 14 : 18 : 46.751 ZigZag_MP (USDJPY,M15)  Average wave size = 273 points; less then average: 65 / 100 min= 106.422 max= 107.848 steps= 57

나는 초자연적인 일을 하지 않습니다. 나는 지그재그의 마지막 100개의 무릎을 센다. 두 번 이상 코드를 변경했지만 문제는 동일하지만 결과가 다르다는 것입니다. 이 시간 동안 몇 개의 틱이 지나갈 수 있지만 현재 막대는 무시되므로 이것이 사실이라고 생각하지 않습니다.

가능한 버전 중 하나를 예상: 표시기 버퍼 를 강제로 초기화합니다. 그 안에 쓰레기가 없습니다.

 
Igor Zakharov :

가능한 버전 중 하나를 예상: 표시기 버퍼 를 강제로 초기화합니다. 그 안에 쓰레기가 없습니다.

질문은 어디에서 초기화합니까

prev_calculated == 0 조건에 따라 모든 것이 정상이면 OnInt() 이면 TF를 전환할 때와 컴파일할 때 실패합니다.

 
Igor Makanu :

질문은 어디에서 초기화합니까

prev_calculated == 0 조건에 따라 모든 것이 정상이면 OnInt() 이면 TF를 전환할 때와 컴파일할 때 실패합니다.

모든 옵션(he-init 및 he-calculate 모두)을 거쳤습니다. 현재: 반복 루프에서 각 값이 개별적으로 할당됩니다. 데이터 창 을 통해 확인해보니 이상/정크 값이 없습니다.

 
Igor Makanu :

캔버스에 한 문자를 표시하고 이동하고 싶습니다. 출처:


이전 렌더링된 이미지를 black 으로 덮어쓰는데 왜 아티팩트가 남아 있습니까?


이것은 평활화 때문입니다. 가장 확실한 방법은 심볼 위에 배경색 을 기준으로 사각형을 그리는 것입니다. 그런 다음 새 좌표로 문자를 출력합니다. 그러한 경우에 일반적으로 수행되는 작업입니다.

 
Igor Makanu :
마이클 마트코프스키 :

이것은 평활화 때문입니다. 가장 확실한 방법은 심볼 위에 배경색 을 기준으로 사각형을 그리는 것입니다. 그런 다음 새 좌표로 문자를 출력합니다. 그러한 경우에 일반적으로 수행되는 작업입니다.

다시 그리거나 칠하지 않고 캔버스를 단순히 움직일 수 있다는 가능성을 잊지 마십시오.
가장 빠르게 이동하는 방법입니다.

 #include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164

void OnStart () {
// Формируем какой-то фон
   for ( int i = 0 ; i< 1000 ; i++) Canvas.Circle( rand ()% 2048 , rand ()% 2048 , 50 + rand ()% 50 ,ARGB( 255 , rand ()% 256 , rand ()% 256 , rand ()% 256 ));
   Canvas.Update();
// -----------------------
   int x= 100 , y= 100 ;
   iCanvas c( 0 ,x,y, "symbol" , 50 , 50 ); // создаем дополнительный канвас размером 50х50
   c.TextPosition( 0 , 0 );
   c.CurentFont( "Tahoma" , 50 );
   c.Comm( "S" );
   c.Update();
   while (! IsStopped ()&& x<W.Height) {
      c.MoveCanvas(++x,++y);         // перемещаем данный канвас
      c.Update();
       Sleep ( 50 );
   }
}
 
Nikolai Semko :

다시 그리거나 칠하지 않고 캔버스를 단순히 움직일 수 있다는 가능성을 잊지 마십시오.
가장 빠르게 이동하는 방법입니다.

아무도 그것을 부정하지 않습니다. 그냥 캔버스 형태의 화면이 하나 있을 때 개념이 있을 뿐입니다. 차례로, 동일한 사용자 정의 캔버스(픽셀 배열)가 창(차트)의 캔버스에 그려집니다. 보다 정확하게는 ResourceCreate(OBJ_BITMAP 또는 OBJ_BITMAP_LABEL )를 사용하여 차트에 먼저 전달(복사)됩니다. 차트 창에서 모든 것은 Win API를 사용하여 그려집니다(내가 틀리지 않았다면). 하지만 다른 API의 도움으로 이를 수행할 수 있습니다. 그러나 CCanvas 클래스에는 m_pixels 배열의 요소에 대한 자체 그리기 메서드가 있습니다.

작은 직사각형을 그릴 때 여전히 ResourceCreate를 사용하여 많은 픽셀을 전송해야 하는 것으로 나타났습니다(그리는데만 시간이 절약됨). 그렇지 않으면 m_pixels 배열을 처리한 다음 OBJ_BITMAP_LABEL에 복사하지 않고 차트에 따라 OBJ_BITMAP_LABEL을 간단히 이동할 수 있습니다.