[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 5. - 페이지 280

 
사용자 지정 표시기 를 다시 그리는 명령을 찾을 수 없습니다. 아시는 분 계시면 알려주세요. 미리 감사드립니다 =)
 
tesla-pip :
사용자 지정 표시기를 다시 그리는 명령을 찾을 수 없습니다. 아시는 분 계시면 알려주세요. 미리 감사드립니다 =)

나는 이미 찾았습니다. 모두 감사합니다 =)
 

안녕하세요.

공식을 생각해내도록 도와주세요.

리필 단계 SD=100이 있습니다.

가격이 25이면 리필 수준은 UD=100이 됩니다.

가격이 102이면 리필 수준은 UD=200이 됩니다.

가격이 215이면 리필 레벨은 UD=300이 됩니다.

가격이 다시 135로 떨어졌고, 토핑 레벨은 UD=200이 됩니다.

 
TarasBY :

그리고 이 순서는 정상입니다(이것이 터미널의 원리입니다).

표시기 A 의 매개변수를 변경할 때 표시기 B 가 판독값을 변경하도록 하려면 표시기(파일, 터미널의 전역 변수, 컴퓨터 RAM) 간에 정보를 교환하십시오. 표시기 A 는 초기화 중에 초기화된 매개변수를 전송하고 표시기 B 는 주기적으로 확인합니다. 표시기 A 의 매개변수 변경 가능성에 대해 변경 사항이 감지되면 표시기 B 도 새 매개변수로 다시 초기화해야 합니다(강제 init() 실행).

답변 감사합니다만 사용이 안되서요. 모든 것을 이해하지 못했고 프로그래밍에 약합니다. 내 지표의 코드에 필요한 변경을 할 수 있습니다.



첫 번째 지표 코드는 A 입니다.

두 번째 코드는 지표 B 입니다.

 //---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_width2   2
#property  indicator_width3   2
#property  indicator_level1 0.0

//---- input parameters
extern int FastPeriod = 5 ;
extern int LowPeriod  = 34 ;
//---- indicator buffers
double      ExtBuffer0[];
double      ExtBuffer1[];
double      ExtBuffer2[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   SetIndexStyle( 0 , DRAW_NONE );
   SetIndexStyle( 1 , DRAW_HISTOGRAM );
   SetIndexStyle( 2 , DRAW_HISTOGRAM );
   IndicatorDigits( Digits + 1 );
   SetIndexDrawBegin( 0 , 34 );
   SetIndexDrawBegin( 1 , 34 );
   SetIndexDrawBegin( 2 , 34 );
//---- 3 indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtBuffer0);
   SetIndexBuffer ( 1 ,ExtBuffer1);
   SetIndexBuffer ( 2 ,ExtBuffer2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName( "My_AO" );
   SetIndexLabel( 1 , NULL );
   SetIndexLabel( 2 , NULL );
//---- initialization done
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
      
  
   int     limit;
   int     counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if (counted_bars> 0 ) counted_bars--;
   limit= Bars -counted_bars;
//---- macd
   for ( int i= 0 ; i<limit; i++)
      ExtBuffer0[i]= iMA ( NULL , 0 ,FastPeriod, 0 , MODE_SMA , PRICE_MEDIAN ,i)- iMA ( NULL , 0 ,LowPeriod, 0 , MODE_SMA , PRICE_MEDIAN ,i);
//---- dispatch values between 2 buffers
   bool up= true ;
   for (i=limit- 1 ; i>= 0 ; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+ 1 ];
       if (current>prev) up= true ;
       if (current<prev) up= false ;
       if (!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]= 0.0 ;
        }
       else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]= 0.0 ;
        }
        
       
     }
//---- done
   return ( 0 );
  }
#property indicator_separate_window
#property indicator_minimum - 1.5
#property indicator_maximum 1.5
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property  indicator_width1   2
#property  indicator_width2   2
#property indicator_level1 0.0

//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle( 0 , DRAW_HISTOGRAM );
   SetIndexBuffer ( 0 ,ExtMapBuffer1);
   SetIndexStyle( 1 , DRAW_HISTOGRAM );
   SetIndexBuffer ( 1 ,ExtMapBuffer2);
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
      
       
     double UP,DN;     
  
  
     int counted_bars=IndicatorCounted(),
       limit;  
       
     if (counted_bars> 0 )
      counted_bars--;
   
      limit= Bars -counted_bars;
//----
   for ( int i= 0 ;i<limit;i++)
       
      { 
        UP= iCustom ( NULL , 0 , "My_AO" , 1 ,i+ 1 );               
        DN= iCustom ( NULL , 0 , "My_AO" , 2 ,i+ 1 );    
             
        
       if (UP> 0 )       
         {ExtMapBuffer1[i+ 1 ]= 1 ;
          ExtMapBuffer2[i+ 1 ]= 0 ;
         }
         
       if (UP< 0 )       
         {ExtMapBuffer1[i+ 1 ]=- 1 ;
          ExtMapBuffer2[i+ 1 ]= 0 ;
         }  
         
                              
       if (DN> 0 )            
         {
          ExtMapBuffer1[i+ 1 ]= 0 ;
          ExtMapBuffer2[i+ 1 ]= 1 ;
         }
              
       if (DN< 0 )            
         {
          ExtMapBuffer1[i+ 1 ]= 0 ;
          ExtMapBuffer2[i+ 1 ]=- 1 ;
         }
               
                       
    
    }
//----
   return ( 0 );
 
   }
   
//+------------------------------------------------------------------+    
   

 

마지막 질문을 해결했습니다, 새로운 질문이 있습니다

각 막대의 리필 수준을 다시 계산합니다.

마지막 막대의 레벨을 어떻게 기억합니까?

거래를 시작하는 데 사용

 
MK07 :
답변 감사합니다만 사용이 안되서요. 모든 것을 이해하지 못했고 프로그래밍에 약합니다. 내 지표의 코드에 필요한 변경을 할 수 있습니다.

당신은 당신이 "장난치는"것을 당신을 위해 나에게 제안합니다. 죄송합니다, 관심이 없습니다.

프로그래밍을 배우고 있다면 이것은 흥미로운 작업입니다.

 
모두에게 좋은 하루. "CurrencyPowerMeter" 칠면조에 문제가 있었습니다. 즉, 터미널 창에서 다른 위치로 이동할 수 없습니다. 도울 수 있는 기회가 있다면 매우 기쁠 것입니다.
 
물어보기로 결정했습니다. 표시기를 작성합니다. 표시기에서 틱 시간 프레임(자율적으로 열리는 시간)에 틱을 처리합니다. 내 버퍼 배열에서는 모든 틱이 처리되지 않고 선택적으로 처리됩니다(60초마다 틱이 있다고 가정하지만 이것은 전혀 필요하지 않습니다). 대신에
 int     counted_bars=IndicatorCounted();

다음 구조를 이해합니다.

 extern int sec= 60 ; //объявляем количество секунд
int i; //будет индексом текущей "свечи" (тика)
int i_prev; //будет индексом предыдущей "свечи" (тика), отстоящего от теущего на sec секунд назад
double MyBuffer[]; //этот будет на чарте
double MyTemp[]; //этот только для подсчётов

int init(){
   IndicatorBuffers( 2 );
   SetIndexBuffer ( 0 ,MyBuffer)
   SetIndexBuffer ( 1 ,MyTemp)
   SetIndexDrawBegin( 0 , 14 );
   i= Bars - 1 ;
   while (Volume[i]-Volume[ Bars - 1 ]<sec) i--; //потому что в Volume[] на тиковом у нас время сервера точностью до секунды (а в Time[] - моделируемое для предоставления тиков на чарте)
   i_prev= Bars - 1 ; //отошли от первого исторического тика на чарте на заданное количество секунд, запомнили его, запомнили первый, уходим в start()
   return ( 0 );
}

int start(){
   double deltaHigh,deltaLow;
   int counted_bars=IndicatorCounted(); //честно говоря, не уверен, т.к. считаем мы не все "свечи" (тики)
   if (counted_bars>=i) i= Bars -counted_bars- 1 ; //аналогично
   while (i>= 0 ){ //цикл обработчика
      deltaHigh=High[i]-High[i_prev]; //к примеру
      deltaLow=Low[i_prev]-Low[i];
       //и дальше код обработчика (формируем предварительный массив MyTemp[]). В конце цикла:
      i_prev=i; //запоминаем теперь текущий индекс как индекс предыдущего тика
       while (Volume[i_prev]-Volume[i]<sec){ //и уходим вперёд на заданное количество секунд
         i--;
      }
   }
...

이제 질문입니다. 순수한 M1 버전에서 표준은 더

   if (counted_bars> 0 ) counted_bars--;
   int limit= Bars -counted_bars; //принтовал, при первом обращении limit=Bars-2, при последующих limit=2
   for (i= 0 ; i<=limit; i++){
      MyBuffer[i]=iMAOnArray(MyTemp, 0 , 14 , 0 , MODE_EMA , i);

limit 및 counted_bars를 교체하는 방법은 무엇입니까? 내가 이해하기로는,

 int counted_bars= ArraySize (MyTemp)-1; //сразу после цикла while

(60초 동안의 틱 수가 일정하지 않기 때문에, 즉 int counted_bars=IndicatorCounted()/_number_of_ticks_in_60_seconds_를 작성하는 것은 작동하지 않습니다).

아니면 내가 모든 것에 대해 잘못 알고 있습니까?

ps 가능한 질문에 앞서 답변드리겠습니다. sec!=60은 Forex에 적용되지 않고 sec=60은 의미가 없지만 Forex에서는 거래하지 않습니다.

 
MK07 :
답변 감사합니다만 사용이 안되서요. 모든 것을 이해하지 못했고 프로그래밍에 약합니다. 내 지표의 코드에 필요한 변경을 할 수 있습니다.
실례합니다만, 차 있으신가요? 있다면 사치품이 아니라 필수품이라고 생각하십니까? 안 그러면 평생 그렇게 두지 않을 거지? 지금은 그런 시대입니다. 자동차를 소유하듯이 프로그래밍도 알아야 합니다. 일반적으로 나는 집단 농부이지만 적어도 어떻게 든 그렇게합니다. 예를 들어 자물쇠 제조공과 같은 마당의 작업에서 프로그래밍하는 것은 다르지 않습니다. 내 손으로 같은 작업 (나는 마을에 산다). 불가리아어, 수레 또는 MQL4는 나를 위한 도구일 뿐입니다. 어쩌면 도시의 경우 다르게 인식되는지도 모르겠습니다. 여기에 매뉴얼의 전역 변수가 있습니다. 표준 파일 기능은 여기 에 있습니다. 이들은 더 빠르지만 WinAPI를 통해 있습니다. 어제 대답하고 싶었지만 침묵했다.
 

좋은 오후에요 여러분!

배열을 사용하는 방법을 배우고 있습니다.

배열이 있습니다. 문자열로 초기화했습니다. 이중 질량 [3567]={ 0.85374 , 0.85694 , 0.85974 ,.... };

그리고 프로그램은 배열을 읽고 그것을 실행했습니다.

이제 동일한 배열을 하나의 열로 초기화했습니다.

더블 마시[3567]

{

질량[0] = 0.85374;
질량[1] = 0.85694;
질량[2] = 0.85974;
질량[3] = 0.86174;
질량[4] = 0.86474;
질량[5] = 0.86494;
질량[6] = 0.86504;

질량[7] = 0.86524;

}

컴파일러는 오류를 제공하지 않지만 경고를 제공하며 프로그램은 배열이나 코드를 전체적으로 실행하지 않습니다.

'{' - 전역 범위에 대한 표현식이 허용되지 않음 C:\Program Files\Alpari NZ MT4(2)\experts\include\MASSIV.mqh (4, 2)

배열은 이전과 같이( 문자열로 초기화되고 제대로 작동했을 때) 전역 수준에서 선언됩니다.

 #include <MASSIV.mqh> 


 
int start()
{
 double Price=iOpen ( Symbol (), 0 , 0 );         
 double SL= NormalizeDouble (Price+ 3000 * Point , Digits );         
 double TP= NormalizeDouble (Price- 100 * Point , Digits );   

 double value =  Bid ; //параметру value функции ArrayBsearch присваивается значение  цены последнего тика
 double ld_Delta = 0.0010 ;
 int S = ArrayBsearch (  mass,  value, WHOLE_ARRAY ,   0 , MODE_ASCEND); //функция возвращает индекс значения цены макс. близкой к цене последнего тика 
 

 int last_order_bar = 0 ;
int ot = OrdersTotal ();
...............................(остальной код опустил,но он  не изменился)

로그에는 2개의 항목만 있습니다.

2013.04.12 04:14:44 XXX 테스트 시작

2013.04.12 16:14:36 ​XXX EURUSD,H1: 성공적으로 로드됨


문제. 프로그램이 하나의 열로 초기화된 어레이를 읽지 않는 이유.

고맙습니다.