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

 

여기 무슨 일이 있었는지.

따로 정확하게 판단하는듯

#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_plots    6
//--- plot UpBar
#property indicator_label1   "UpBar"
#property indicator_type1   DRAW_ARROW
#property indicator_color1   clrDeepSkyBlue
#property indicator_style1   STYLE_SOLID
#property indicator_width1   1
//--- plot DnBar
#property indicator_label2   "DnBar"
#property indicator_type2   DRAW_ARROW
#property indicator_color2   clrDeepPink
#property indicator_style2   STYLE_SOLID
#property indicator_width2   1

//--- plot UpFr
#property indicator_label3   "UpFr"
#property indicator_type3   DRAW_ARROW
#property indicator_color3   clrBlue
#property indicator_style3   STYLE_SOLID
#property indicator_width3   1
//--- plot DnFr
#property indicator_label4   "DnFr"
#property indicator_type4   DRAW_ARROW
#property indicator_color4   clrRed
#property indicator_style4   STYLE_SOLID
#property indicator_width4   1

//--- plot UpBarFr
#property indicator_label5   "UpBarFr"
#property indicator_type5   DRAW_ARROW
#property indicator_color5   clrBlue
#property indicator_style5   STYLE_SOLID
#property indicator_width5   1
//--- plot DnBarFr
#property indicator_label6   "DnBarFr"
#property indicator_type6   DRAW_ARROW
#property indicator_color6   clrRed
#property indicator_style6   STYLE_SOLID
#property indicator_width6   1

//--- input parameters
input ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT ;
input string           cSymbol   = "AUDCAD" ;
input int              CountBar  = 5 ; // Баров подряд

//--- indicator buffers
double BufferUPb[];
double BufferDNb[];
double BufferUPf[];
double BufferDNf[];
double BufferUPbf[];
double BufferDNbf[];

//--- global variables
double open1= 0 ,close1= 0 ,open2= 0 ,close2= 0 ;
double frDn= 0 ,frUp= 0 ,frUp1= 0 ,frUp2= 0 ,frUp3= 0 ,frDn1= 0 ,frDn2= 0 ,frDn3= 0 ;
string dSymbol;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
dSymbol=cSymbol== "" ? _Symbol :cSymbol;
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,BufferUPb);
   SetIndexBuffer ( 1 ,BufferDNb);
   SetIndexBuffer ( 2 ,BufferUPf);
   SetIndexBuffer ( 3 ,BufferDNf);
   SetIndexBuffer ( 4 ,BufferUPbf);
   SetIndexBuffer ( 5 ,BufferDNbf);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   SetIndexArrow ( 0 , 233 );
   SetIndexArrow ( 1 , 234 );
   SetIndexArrow ( 2 , 221 );
   SetIndexArrow ( 3 , 222 );
   SetIndexArrow ( 4 , 108 );
   SetIndexArrow ( 5 , 108 );
//---
   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     b= 1 ,s= 1 ;

if (rates_total< 2 ) return ( 0 );
int limit=rates_total-prev_calculated;
   if (limit> 1 ) {
   limit=rates_total- 2 ;
     ArrayInitialize (BufferUPb, EMPTY_VALUE );
     ArrayInitialize (BufferDNb, EMPTY_VALUE );
     ArrayInitialize (BufferUPf, EMPTY_VALUE );
     ArrayInitialize (BufferDNf, EMPTY_VALUE );
     ArrayInitialize (BufferUPbf, EMPTY_VALUE );
     ArrayInitialize (BufferDNbf, EMPTY_VALUE );
  }
  
for ( int i=limit; i>= 0 ; i--) {

//--------------------------------------------------------------
  open1= iOpen (dSymbol, TimeFrame, i);
  close1= iClose (dSymbol, TimeFrame, i);
  open2= iOpen (dSymbol, TimeFrame, i+ 1 );
  close2= iClose (dSymbol, TimeFrame, i+ 1 );
  
   if (open2<close2 && open1<close1 && open2<open1) {
    b++;
     if (b==CountBar) {
      BufferUPb[i]= Low [i]- 200 * _Point ;
      b= 1 ;
    }
   } else { b= 1 ;}

//---
   if (open2>close2 && open1>close1 && open2>open1) {
    s++;
     if (s==CountBar) {
      BufferDNb[i]= High [i]+ 200 * _Point ;
      s= 1 ;
    }
   } else { s= 1 ;}

//--------------------------------------------------------------
  frDn= iFractals (dSymbol, TimeFrame, MODE_LOWER , i);
   if (frDn!= 0 ) {
    frDn1=frDn;
   }
//-
   if (frDn3 > frDn2 && frDn2 < frDn1) {
    BufferUPf[i]= Low [i]- 200 * _Point ;
  }

   if (frDn2!=frDn3 && frDn2!=frDn1) { frDn3=frDn2;} frDn2=frDn1;
  
//---
  frUp= iFractals (dSymbol, TimeFrame, MODE_UPPER , i);
   if (frUp!= 0 ) {
    frUp1=frUp;
   }
//-
   if (frUp3 < frUp2 && frUp2 > frUp1) {
    BufferDNf[i]= High [i]+ 200 * _Point ;
  }

   if (frUp2!=frUp3 && frUp2!=frUp1) { frUp3=frUp2;} frUp2=frUp1;

//--------------------------------------------------------------

//-
   if ( /*что сюда*/ ) {
    BufferUPbf[i]= Low [i]- 200 * _Point ;
  }
  
//-
   if ( /*что сюда*/ ) {
    BufferDNbf[i]= High [i]+ 200 * _Point ;
  }


//------------
  } // end for
//--- return value of prev_calculated for next call
   return (rates_total);
}
//--------------------------------------------------------------

문제는 이 모든 것을 결합하여 버퍼 5와 6에 출력하는 방법입니다.

고맙습니다!

 

인사말.

주문 선택 기능에서 특정 주문을 카운팅하는 작성 기능에서 선택 유형을 주문 선택에서 티켓 선택으로 변경했습니다.

int BuyLimitCount(){
int count= 0 ;
for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--){
if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicB){
if ( OrderType ()== OP_BUYLIMIT )
count++;}}} return (count);}  

int BuyLimitCount(){
int count= 0 ;
if ( OrderSelect (ticketUP, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicB){
if ( OrderType ()== OP_BUYLIMIT )
count++;}} return (count);}

그 후 수십 개의 양초를 시작하면 모든 것이 올바르게 해결되고 다음 오류가 로그로 이동하여 반복됩니다.

2016.12.17 17:44:31.609 2016.12.07 00:27 test3 EURUSD,M1: OrderModify 기능에 대한 알 수 없는 티켓 2

2016.12.17 17:44:31.608 2016.12.07 00:25 test3 EURUSD,M1: OrderModify 오류 4108 // 잘못된 티켓 번호입니다.

다음은 네 가지 기능 모두에서 그에 따라 변경된 전체 텍스트입니다.

extern int pointsl= 100 , pointtp= 100 , MagicB= 1111 , MagicS= 2222 , bars= 10 ;   extern double lotB= 0.1 , lotS= 0.1 ;
double slB, tpB, slS, tpS;   double x= 0 , z= 0 ; int ticketUP, ticketD;


void OnTick ()  
{
double maxpr1=- 9999 ; double minpr1= 9999 ;

for ( int shift1= 0 ; shift1<bars; shift1++)
{ double i= iHigh ( Symbol (), PERIOD_CURRENT , shift1);
if (i>maxpr1){maxpr1=i;}}

for ( int shiftA1= 0 ; shiftA1<bars; shiftA1++)
{ double y= iLow ( Symbol (), PERIOD_CURRENT , shiftA1);
if (y<minpr1) {minpr1=y;}}

if (BuyLimitCount()== 0 && BuyCount()== 0 ){
slB= NormalizeDouble (minpr1-pointsl* Point , 5 );
tpB= NormalizeDouble (minpr1+pointtp* Point , 5 );
ticketUP= OrderSend ( Symbol (), OP_BUYLIMIT , lotB, minpr1, 3 , slB, tpB, "" , MagicB, 0 , Red);
if (ticketUP==- 1 ) Print ( "ERROR OP_BUY" ); else Print ( "OP_BUY OK" );}

if (SellLimitCount()== 0 && SellCount() == 0 ){
slS= NormalizeDouble (maxpr1+pointsl* Point , 5 );
tpS= NormalizeDouble (maxpr1-pointtp* Point , 5 );
ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, maxpr1, 3 , slS, tpS, "" , MagicS, 0 , Blue);
if (ticketD==- 1 ) Print ( "ERROR OP_SELL" ); else Print ( "OP_SELL OK" );}

if (x!=maxpr1){x=maxpr1;
slS= NormalizeDouble (maxpr1+pointsl* Point , 5 );
tpS= NormalizeDouble (maxpr1-pointtp* Point , 5 );
OrderModify (ticketD, maxpr1, slS, tpS, 0 , Blue);}

if (z!=minpr1){z=minpr1;
slB= NormalizeDouble (minpr1-pointsl* Point , 5 );
tpB= NormalizeDouble (minpr1+pointtp* Point , 5 );
OrderModify (ticketUP, minpr1, slB, tpB, 0 , Red);}

double maxpr=- 9999 ; double minpr= 9999 ;

for ( int shift= 0 ; shift<bars; shift++)
{ double e= iHigh ( Symbol (), PERIOD_CURRENT , shift);
if (e>maxpr){maxpr=e;}}

for ( int shiftA= 0 ; shiftA<bars; shiftA++)
{ double r= iLow ( Symbol (), PERIOD_CURRENT , shiftA);
if (r<minpr) {minpr=r;}}

string a;
if (bars== 1 )a= "bar: " ;
else a= IntegerToString (bars, 1 ) + " bar's: " ;
Comment ( "Last " , a, "max " , DoubleToStr (maxpr, 5 ), ", min " , DoubleToStr (minpr, 5 ), "." );
}

int BuyLimitCount(){
int count= 0 ;
if ( OrderSelect (ticketUP, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicB){
if ( OrderType ()== OP_BUYLIMIT )
count++;}} return (count);}

int BuyCount(){
int count= 0 ;
if ( OrderSelect (ticketUP, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicB){
if ( OrderType ()== OP_BUY )
count++;}} return (count);}

int SellLimitCount(){
int count= 0 ;
if ( OrderSelect (ticketD, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicS){
if ( OrderType ()== OP_SELLLIMIT )
count++;}} return (count);}

int SellCount(){
int count= 0 ;
if ( OrderSelect (ticketD, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicS){
if ( OrderType ()== OP_SELL )
count++;}} return (count);}


왜 이런 일이 일어나고 어떻게 대처해야 합니까?


 
spoiltboy :

인사말.

주문 선택 기능에서 특정 주문을 카운팅하는 작성 기능에서 선택 유형을 주문 선택에서 티켓 선택으로 변경했습니다.

int BuyLimitCount(){

int count= 0 ;

for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--){

if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== true ){

if ( OrderMagicNumber ()==MagicB){

if ( OrderType ()== OP_BUYLIMIT )

count++;}}} return (count);}  
그리고 어디?
 
Artyom Trishkin :
그리고 어디?
추가되었습니다. 효율성에 감사드립니다.
 
spoiltboy :
추가되었습니다. 효율성에 감사드립니다.
그리고 어디? 티켓의 선택은 어디에 있습니까?
 
Artyom Trishkin :
그리고 어디? 티켓의 선택은 어디에 있습니까?

예, 위의 게시물에 있습니다. 아니면 문제가 있습니까?

int BuyLimitCount(){
int count= 0 ;
if ( OrderSelect (ticketUP, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicB){
if ( OrderType ()== OP_BUYLIMIT )
count++;}} return (count);}

int BuyCount(){
int count= 0 ;
if ( OrderSelect (ticketUP, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicB){
if ( OrderType ()== OP_BUY )
count++;}} return (count);}

int SellLimitCount(){
int count= 0 ;
if ( OrderSelect (ticketD, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicS){
if ( OrderType ()== OP_SELLLIMIT )
count++;}} return (count);}

int SellCount(){
int count= 0 ;
if ( OrderSelect (ticketD, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicS){
if ( OrderType ()== OP_SELL )
count++;}} return (count);}
 
spoiltboy :

예, 위의 게시물에 있습니다. 아니면 문제가 있습니까?

int BuyLimitCount(){
int count= 0 ;
if ( OrderSelect (ticketUP, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicB){
if ( OrderType ()== OP_BUYLIMIT )
count++;}} return (count);}

int BuyCount(){
int count= 0 ;
if ( OrderSelect (ticketUP, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicB){
if ( OrderType ()== OP_BUY )
count++;}} return (count);}

int SellLimitCount(){
int count= 0 ;
if ( OrderSelect (ticketD, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicS){
if ( OrderType ()== OP_SELLLIMIT )
count++;}} return (count);}

int SellCount(){
int count= 0 ;
if ( OrderSelect (ticketD, SELECT_BY_TICKET , MODE_TRADES )== true ){
if ( OrderMagicNumber ()==MagicS){
if ( OrderType ()== OP_SELL )
count++;}} return (count);}
올바른 티켓을 선택하는 방법을 읽는 것이 좋습니다. 자신이하고있는 일을 스스로 이해하는 것이 바람직합니다. 휴대폰으로 다른건 말씀드리기 어렵네요.
 
Artyom Trishkin :
올바른 티켓을 선택하는 방법을 읽는 것이 좋습니다. 자신이하고있는 일을 스스로 이해하는 것이 바람직합니다. 휴대폰으로 다른건 말씀드리기 어렵네요.

나는 그것을 읽었고 오류를 찾을 수 없었습니다 (홀의 도움이 필요합니다).

그리고 여기에 한 가지 포인트가 있습니다. 선택 기능을 변경한 후 주문 수정 기능에서 오류가 발생하기 시작했고 테스트 시작 후 얼마 지나지 않아 .

 
spoiltboy :

나는 그것을 읽었고 오류를 찾을 수 없었습니다 (홀의 도움이 필요합니다).

그리고 여기에 한 가지 포인트가 있습니다. 선택 기능을 변경한 후 주문 수정 기능에서 오류가 발생하기 시작했고 테스트 시작 후 얼마 지나지 않아 .

예매권은 어디서 받나요?
 
Artyom Trishkin :
예매권은 어디서 받나요?
ticketUP= OrderSend ( Symbol (), OP_BUYLIMIT , lotB, minpr1, 3 , slB, tpB, "" , MagicB, 0 , Red);

ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, maxpr1, 3 , slS, tpS, "" , MagicS, 0 , Blue);