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

 

안녕하세요!

한 달 동안 MQL4 교재를 공부한 끝에 Expert Advisor를 쓰기로 했고, 경험 부족으로 새로 만들지 않기 위해 교재에서 tradingexpert.mq4 템플릿을 가져오기로 했습니다.

전략의 핵심은 다음과 같습니다. 래리 윌리엄스의 고점과 저점의 3개 막대 시스템, 우리는 고점과 저가에서 2개의 3일 EMA를 구축하고 판매합니다.

최대에서 최소로 가자.

전역 변수 섹션의 템플릿에서 extern double Rastvor =28.0; 라인을 제거했습니다. (실제로는 필요하지 않습니다) 또한 거래 기준에서 제거했습니다.

전역 변수의 MA 값을 3으로 변경:

외부 정수 Period_MA_1= 3; // MA 기간 1
외부 정수 Period_MA_2= 3; // MA 기간 2

거래 기준 섹션에는 다음이 있었습니다.

 //--------------------------------------------------------------- 5 --
   // Торговые критерии
   MA_1_t = iMA ( NULL , 0 , Period_MA_1 , 0 , MODE_LWMA , PRICE_TYPICAL , 0 ) ; // МА_1
   MA_2_t = iMA ( NULL , 0 , Period_MA_2 , 0 , MODE_LWMA , PRICE_TYPICAL , 0 ) ; // МА_2
 
   if ( MA_1_t > MA_2_t + Rastvor * Point )         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_B = true ;                               // Критерий откр. Buy
      Cls_S = true ;                               // Критерий закр. Sell
     }
   if ( MA_1_t < MA_2_t - Rastvor * Point )         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_S = true ;                               // Критерий откр. Sell
      Cls_B = true ;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 
가 되었다:

//------------------------------------------------ --------------- 5 --
// 거래 기준
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_HIGH,0); // MA_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_EMA,PRICE_LOW,0); // MA_2

if (PRICE_HIGH * 포인트 >= MA_1_t * 포인트)
{
Opn_S=참;
Cls_B=참;
}

if (PRICE_LOW * 포인트 <= MA_2_t * 포인트)
{
Opn_B=참; // 기준을 엽니다. 구입
CLs_S=참; // 기준을 닫습니다. 팔다
}
//------------------------------------------------ ---------------

이제 문제의 본질은 시스템이 판매 주문만 열지만 구매를 원하지는 않는다는 것입니다. 무엇이 잘못되었을 수 있습니까?

다른곳에 오류가 있을 수 있으니 깐깐하게 판단하지 마시고 조언 부탁드립니다)

 
Forexman77 :


//------------------------------------------------ --------------- 5 --
// 거래 기준
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_HIGH,0); // MA_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_EMA,PRICE_LOW,0); // MA_2

if (PRICE_HIGH * 포인트 >= MA_1_t * 포인트)
{
Opn_S=참;
Cls_B=참;
}

if (PRICE_LOW * 포인트 <= MA_2_t * 포인트)
{
Opn_B=참; // 기준을 엽니다. 구입
CLs_S=참; // 기준을 닫습니다. 팔다
}
//------------------------------------------------ ---------------

이제 문제의 본질은 시스템이 판매 주문만 열지만 구매를 원하지는 않는다는 것입니다. 무엇이 잘못되었을 수 있습니까?

다른곳에 오류가 있을 수 있으니 깐깐하게 판단하지 마시고 조언 부탁드립니다)



그것은 무엇입니까? PRICE_LOW 및 PRICE_HIGH. 이들은 0 또는 1, 최대 6까지의 값을 갖는 올인원 상수입니다.

막대 i의 최대 BID를 얻으려면 iHigh (Symbol(),Period(),i)를 사용하고 막대 i의 최소 BID를 얻으려면 iLow(Symbol(),Period(),i)를 사용해야 합니다.

현재 막대에서 넘어지는 경우: if ( iHigh(Symbol(),Period(),0) >= MA_1_t) 그리고 MA에 Point를 곱할 필요가 없습니다.

 

모두에게 좋은 하루!

무엇이 잘못되었는지 알려주세요.

볼륨 표시기(볼륨)를 표준 Awesome 표시기에 나사로 고정했습니다.

웨이브의 볼륨 계산을 구성하고 싶습니다(낮은 가격에서 높은 가격으로 계산되며 Awesome의 최소 및 최대 값에 해당). 그림 1을 참조하십시오.

쌀1

잘못된 값은 고려하지 않습니다.

아래는 코드 자체입니다.

 #property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  SteelBlue
#property  indicator_width1   2

//---- basic fan indicator parameters

extern bool Show_AOLine_2= true ;
extern int SlowEMA3= 34 ;
extern int EMA= 2 ;
extern bool Show_Volume= true ;
extern double coaf= 1.5 ;
extern bool Show_Vol_line= true ;
//---- indicator buffers
double AOBuffer3[];
double ExtMapBuffer1[];


double VLUP;
   double prhgh_e= 0 , prhgh_s, prlw_e= 0 , prlw_s;
     datetime tmhgh, tmlw;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   
   string name_ind = "Awesome_super_volumes" ;
   IndicatorShortName( "Awesome_super_volumes" );
   
   
//---- AO_fan line 2 (basic)
   if (Show_AOLine_2 == true ){Show_AOLine_2= DRAW_LINE ; }
   else 
    {Show_AOLine_2= DRAW_NONE ; }
   SetIndexBuffer ( 0 ,AOBuffer3);
   SetIndexStyle( 0 ,Show_AOLine_2);
   SetIndexLabel( 0 , "basic line" );   

   SetIndexBuffer ( 1 ,ExtMapBuffer1);
   SetIndexStyle( 1 , DRAW_HISTOGRAM );
   SetIndexLabel( 1 , "Volume" );
   
   //---- 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;

//---- AO_fan line 2 (basic) buffer
   for ( int i= 0 ; i<limit; i++)
   {
     
 //---- AO_fan basic line + Volumes
     
      AOBuffer3[i]= iMA ( NULL , 0 ,EMA, 0 , MODE_SMA , PRICE_MEDIAN ,i)- iMA ( NULL , 0 ,SlowEMA3, 0 , MODE_SMA , PRICE_MEDIAN ,i);
if (Show_Volume== true )
{
double nSum = Volume[i]* Point *coaf;
   if (AOBuffer3[i]<= 0 )ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]> 0 )ExtMapBuffer1[i] = -nSum;
}
if (Show_Vol_line== true )
{
double Vol_Arr[];


   if (AOBuffer3[i]<= 0 )Vol_Arr[i]=Volume[i]* Point *coaf;
   if (AOBuffer3[i]> 0 )Vol_Arr[i] = -Volume[i]* Point *coaf;}
//---- dispatch values between 2 buffers
   }
   
   //-- Поиск High & Time  
   if (AOBuffer3[i]>= 0 )
  {
  prhgh_s = High[i];
   if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}
  }   
   
   //-- Поиск Low & Time  
   if (AOBuffer3[i]<= 0 )
  {
  prlw_s = Low[i];
   if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}
  } 
  
   // -- Пересчет баров от High до Low
   int colbr = iBarShift( NULL , 0 ,tmhgh)-iBarShift( NULL , 0 ,tmlw);     
  
   int shift=iBarShift( NULL , 0 ,tmlw);
  
 for (i= 0 ; i<=colbr; i++)
{VLUP += MathAbs (iVolume( NULL , 0 , shift+i));}
       
  SetText( "Awesome_super_volumes" +Time[i], DoubleToStr(VLUP, 0 ), tmhgh, 0.0010 , Black);     
 
//-- Эти значения должны отображаться в окне Awesome
  SetText2( "Волна1" ,DoubleToStr(VLUP, 0 ), 980 , 10 ,Gray, 10 ); 
  SetText2( "Волна2" ,TimeToStr(tmlw, 0 ), 980 , 25 ,Gray, 10 ); 
  SetText2( "Волна3" ,TimeToStr(tmhgh, 0 ), 980 , 40 ,Gray, 10 );
  SetText2( "Волна4" ,DoubleToStr(colbr, 0 ), 980 , 55 ,Gray, 10 );  
  
  
      
//---- done
   return ( 0 );
  }
//+------------------------------------------------------------------+
void SetText( string name, string Vl, datetime t1, double p1, color c)
 {
 // if (ObjectFind(name)!=-1) ObjectDelete(name);
   ObjectCreate (name, OBJ_TEXT ,WindowFind( "Awesome_super_volumes" ), 0 , 0 , 0 , 0 );
  ObjectSetText(name, Vl, 10 , "Times New Roman" , c);
  ObjectSet(name, OBJPROP_TIME1 , t1);
  ObjectSet(name, OBJPROP_PRICE1, p1);
  ObjectSet(name, OBJPROP_COLOR , c); 
  }
  
//--Ввeл дополнительную процедуру для отображения значений на чарте. Ее не должно быть.
   void SetText2( string name, string text, int xdist, int ydist, color c, int size) 
 {                                                                                    
   ObjectCreate (name, OBJ_LABEL , 0 , 0 , 0 , 0 , 0 );     
  ObjectSet(name, OBJPROP_XDISTANCE , xdist);
  ObjectSet(name, OBJPROP_YDISTANCE , ydist);    
  ObjectSetText(name,text, 7 , "Arial Black" ,c);
 }
 
Sepulca :


그것은 무엇입니까? PRICE_LOW 및 PRICE_HIGH. 이들은 0 또는 1, 최대 6까지의 값을 갖는 올인원 상수입니다.

막대 i의 최대 BID를 얻으려면 iHigh(Symbol(),Period(),i)를 사용하고 막대 i의 최소 BID를 얻으려면 iLow(Symbol(),Period(),i)를 사용해야 합니다.

현재 막대에서 공중제비를 하는 경우: if ( iHigh(Symbol(),Period(),0) >= MA_1_t) 그리고 MA에 Point를 곱할 필요가 없습니다.

정말 감사합니다!!! 공장!!
 

얘들 아 코드 plz에 무슨 문제가 있는지 누군가 나에게 말해!

 
Fox_RM :

얘들 아 코드 plz에 무슨 문제가 있는지 누군가 나에게 말해!


 if (Show_Vol_line== true )
{
double Vol_Arr[]; // ошибки: 1. Размещение  2. Область видимости


   if (AOBuffer3[i]<= 0 )Vol_Arr[i]=Volume[i]* Point *coaf;
   if (AOBuffer3[i]> 0 )Vol_Arr[i] = -Volume[i]* Point *coaf;}
//---- dispatch values between 2 buffers
   }
   
 
VladislavVG :


이해가 잘 안됩니다. 그러나 볼륨 표시 에는 문제가 없습니다. 볼륨 계산에 문제가 있습니다. 여기 어딘가.

 //-- Поиск High & Time  
   if (AOBuffer3[i]>= 0 )
  {
  prhgh_s = High[i];
   if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];} // -- tmhgh - выводил это значение оно = 0;

  }   
   
   //-- Поиск Low & Time  
   if (AOBuffer3[i]<= 0 )
  {
  prlw_s = Low[i];
   if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}
  } 
  
   // -- Пересчет баров от High до Low
   int colbr = iBarShift( NULL , 0 ,tmhgh)-iBarShift( NULL , 0 ,tmlw);    tmlw - тоже = 0; Почему?
  
   int shift=iBarShift( NULL , 0 ,tmlw);
  
 for (i= 0 ; i<=colbr; i++)
{VLUP += MathAbs (iVolume( NULL , 0 , shift+i));}
       
  SetText( "Awesome_super_volumes" +Time[i], DoubleToStr(VLUP, 0 ), tmhgh, 0.0010 , Black);     
 
asdfgh001 :

안녕하세요!

내 질문은 주제에서 약간 벗어납니다.

어딘가에서 CSV 파일 형식의 TA 수치를 찾을 수 있는지 알려주실 수 있습니까? 프로그래밍 방식으로 처리할 수 있는 txt, xls 또는 기타 형식과 함께 허용되는 옵션입니다.

다양한 기사, TA에 관한 교과서에는 TA 피규어의 예가 있지만 물론 일반 그림의 형태입니다. 그러나 H1-H4 기간에 일부 통화 쌍의 역사의 일부로 저장된 TA 수치의 다소 큰 세트를 본 사람이 있습니까?

구글링, 찾지 못했습니다. 물론 기록을 수동으로 반복하고 모양을 표시하고 이 기록 조각을 .csv로 내보낼 수 있습니다. 필요한 횟수만큼 반복하여 결과의 기초를 수집하십시오. 그러나 누군가가 이미 이것을 했다면 나는 시간을 절약하고 싶습니다.

미리 감사드립니다 :)


CSV 파일 형식의 수치가 필요한 이유는 무엇입니까? 그림 라이브러리를 작성하십시오... 그림을 이해하기 위해 직접 작성하고 다른 사람의 것을 가져오지 마십시오. 더 많다고 더 좋은 것은 아닙니다!
 
Fox_RM :


이해가 잘 안됩니다. 그러나 볼륨 표시에는 문제가 없습니다. 볼륨 계산 에 문제가 있습니다. 여기 어딘가.


1. 배열을 할당해야 합니다. 즉, 메모리를 할당해야 합니다. 그렇지 않으면 단순히 값을 저장할 곳이 없습니다.).

2. 새로운 틱이 수신되면 할당된 배열도 재할당/재초기화됩니다. 범위와 관련이 있습니다. 이러한 일이 발생하지 않도록 하려면 배열이 "정적" 유형이어야 합니다.

프로그래밍의 기초에 대해 읽어보세요.

ZY 배열 사용 시 오류를 지적한 부분을 계산하는 데 문제가 있습니다.

 
VladislavVG :


1. 배열을 할당해야 합니다. 즉, 메모리를 할당해야 합니다. 그렇지 않으면 단순히 값을 저장할 곳이 없습니다.).

2. 새로운 틱이 수신되면 할당된 배열도 재할당/재초기화됩니다. 범위와 관련이 있습니다. 이러한 일이 발생하지 않도록 하려면 배열이 "정적" 유형이어야 합니다.

프로그래밍의 기초에 대해 읽어보세요.

ZY 배열 사용 시 오류를 지적한 부분을 계산하는 데 문제가 있습니다.

저것들. Vol_Arr[] 은 내가 이해하는 대로 전역 배열로 초기화해야 합니다.


질문은 물론 멍청한 놈이지만.

1. 표시기의 볼륨이 올바르게 표시되는 이유는 무엇입니까?

2. 계산할 때 Vol_Arr[]이 아니라 AOBuffer3[] 을 참조합니다 .

고맙습니다!