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

 
Добрый день. Прошу помощи. Уже пару недель безуспешно пытаюсь заставить индикатор круглых уровней заставить (см.код) передавать их для использования в эксперте через iCustom. Прошу помочь поправить код.




#property indicator_chart_window

extern string H                     = " --- Mode_Settings ---";
extern bool   Show_00_50_Levels     = true;
extern bool   Show_20_80_Levels     = true;
extern color  Level_00_Color        = Lime;
extern color  Level_50_Color        = Gray;
extern color  Level_20_Color        = Red;
extern color  Level_80_Color        = Green;

double dXPoint = 1;
double Div = 0;
double i = 0;
double HighPrice = 0;
double LowPrice = 0;
int iDigits;
  
int start() 
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
  
  if(Show_00_50_Levels)
  {
   for (i = LowPrice; i <= HighPrice; i++) 
   {
      if (MathMod(i, 5) == 0.0) {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
            if(MathMod(i, 10) == 0.0)
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_00_Color);
            }
            else
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_50_Color);
            }
         }
      }
   }
   
  }
  
  if(Show_20_80_Levels)
  {
  
   for (i = LowPrice; i <= HighPrice; i++) 
   {
         
        if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="20") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT); 
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_20_Color);
            
            }
         }
        
         
         if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="80") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
           
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_80_Color);
            }
         }
         
   }
   
  }
  
   return (0);
}

int init() 
{
   iDigits = Digits;
   if(Digits==5 || Digits==3)dXPoint=10;
   if(Digits==3)  iDigits=2;
   if(Digits==5)  iDigits=4;
   
   Div = 0.1 / (Point*dXPoint);
   return (0);
}

int deinit()
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
   for (i = LowPrice; i <= HighPrice; i++) ObjectDelete("RoundPrice " + DoubleToStr(i, 0));
   return (0);
 
Aleksey Mavrin :
프로그래밍에서 거의 0이라고 말하면 왜 그런 비표준 작업을 수행합니까? 간단한 작업으로 시작합니까? 글쎄, 또는 기본 지식을 강화? 여기에서 하는 것이 더 쉽습니다. 네.

나는 "나를 지표로 삼으십시오"라고 쓰지 않았습니다. 도움을 요청했습니다. mql4를 완전히 마스터하는 것은 가치가 없습니다. 나는 단지 아이디어를 테스트하고 있습니다. 이미 고통받는 엑셀로)

 
Oleg Bondarev :

나는 "집합 농부"라고 경고했다)

그가 그렇게 했습니다.

이제 눈금 차트를 그리지만 일부 줄 바꿈이 있습니다.

4에서 합니다.

줄 바꿈은 Label1Buffer[XXX]에 값이 없음을 의미합니다.

그리고 두 번째로, 위에서 다시 한 번 썼습니다 - 표시기 버퍼 ( Label1Buffer   )는 터미널에 의해 제어되며 새 막대가 나타나면 값이 모두 자동으로 이동합니다. M1에서 코드를 실행하고 시계

추신: 농부가 아니라 스스로 배우려고 하는 농부입니다! ))))

 
Igor Makanu :

줄 바꿈은 Label1Buffer[XXX]에 값이 없음을 의미합니다.

그리고 두 번째로, 위에서 다시 한 번 썼습니다 - 표시기 버퍼 ( Label1Buffer   )는 터미널에 의해 제어되며 새 막대가 나타나면 값이 모두 자동으로 이동합니다. M1에서 코드를 실행하고 시계

추신: 농부가 아니라 스스로 배우려고 하는 농부입니다! ))))

Label1Buffer[ХХХ] - 이것은 3-복합 숫자를 의미합니까?


 
Oleg Bondarev :

Label1Buffer[ХХХ] - 이것은 3-복합 숫자를 의미합니까?


아니, 내가 기억하는 첫 글자를 썼어

요소 번호인 숫자입니다.

코드를 보세요. 내 주기와 유추하여 자신만의 코드를 작성했습니다. 여기서 Label1Buffer 표시기 버퍼 를 한 요소만큼 이동합니다. 각 표시기 호출(각 틱)을 확인하십시오.

Label1Buffer의 내용을 이동한 후 Label1Buffer[0]에 새 값할당 합니다.

다른 요소의 값은 무엇입니까? 처음 시작할 때 "빈 값"(EMPTY_VALUE)을 갖고 한 번 이동하고 새 값을 할당합니다.... 그런 다음 새 막대가 나타날 때 터미널 자체에서 모든 Label1Buffer 값 을 이동합니다.


일반적으로 지식에 약간의 변화가 있지만 표시기로 막대의 종가를 그려보십시오. 여기에 코드가 있습니다.

 #property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot line1
#property indicator_label1    "line1"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- input parameters
input int       Input1= 10 ;
//--- indicator buffers
double          line1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,line1Buffer);
   IndicatorDigits( Digits );
   
//---
   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[])
  {
//---
   int i,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if (prev_calculated== 0 ){
      limit=rates_total- 1 ;
   } else
      limit=rates_total-prev_calculated+ 1 ; // или limit=rates_total-prev_calculated ; чтобы не перерисовывать бар №1
//--- Основной цикл расчета
//Print("limit = ",limit);
   for (i=limit; i>= 0 ; i--){
      line1Buffer[i]=close[i];
    }
//---
   return (rates_total);

  }
//+------------------------------------------------------------------+
 
나는 당신을 이해했다. 나는 생각해야 한다. 고맙습니다!
 

Excel에서 데이터를 작성하는 방법? - MQL5

Excel 파일 형식은 xlsx이고 FileOpen 함수 는 txt 및 csv와 같은 파일을 만들고 작동합니다.


OnTester에서 테스트한 후 각 틱에서 포지션이 열렸을 때 다른 데이터의 이력을 포함하는 버퍼에서 데이터를 언로드한 다음 모든 트랜잭션의 데이터를 하나의 차트에 표시해야 합니다.
아시다시피 모든 트랜잭션은 물론 하나의 트랜잭션에도 많은 데이터가 있으므로 "수동 전송" 옵션은 적합하지 않습니다.


추천 메뉴가 무엇인가요?

 
Alexandr Sokolov :

Excel에서 데이터를 작성하는 방법? - MQL5

Excel 파일 형식은 xlsx이고 FileOpen 함수 는 txt 및 csv와 같은 파일을 만들고 작동합니다.


OnTester에서 테스트한 후 각 틱에서 위치가 열린 순간에 다른 데이터의 히스토리가 포함된 버퍼에서 데이터를 언로드한 다음 모든 트랜잭션의 데이터를 하나의 차트에 표시해야 합니다.
아시다시피 모든 트랜잭션은 물론 하나의 트랜잭션에도 많은 데이터가 있으므로 "수동 전송" 옵션은 적합하지 않습니다.


추천 메뉴가 무엇인가요?

일반적으로 본질은 간단합니다. MQL5를 사용하면 프로그래밍 방식으로 Excel 파일에 직접 작성할 수 없지만 Excel 자체에서는 "데이터"의 텍스트 파일에서 데이터를 가져올 수 있습니다. >> > "텍스트에서" 탭

 
안녕하세요, 전문가 테스트가 끝난 후 삭제되지 않은 개체에 대한 오류가 발생하고 내가 이해하는 한 절대적으로 모든 개체를 스택에서, 즉 새 개체 없이 생성합니다. 이 질문에 대해 설명해 주십시오.
 
Alexandr Sokolov :

추천 메뉴가 무엇인가요?

.csv에 쓰고 엑셀에서 열기