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

 

QQEA 지표를 기반으로 Expert Advisor를 작성하고 있습니다. 일반적으로 어드바이저의 아이디어는 다음과 같습니다. 빨간색 선이 노란색 선을 아래에서 위로 교차할 때 빨간색 선이 노란색 선을 위에서 아래로 교차 하나 의 매수 주문을 열어야 합니다. 판매용. 하지만 주문을 하나만 열 수는 없습니다. 조건이 충족되는 동안 주문이 열립니다. 예, 구매 주문만 CHYADNT에서 찢어집니다!

// //

고문 코드

 //--- input parameters
extern double MaxRisk= 1.0 ;
extern double FixLot = 0.01 ;
extern double Exponent= 2.0 ;
extern int Magic = 888 ;

// костыли

extern int TakeProfit= 100 ;
extern int StopLoss= 100 ;

int init()
   return ( 0 );
}
int deinit()
{
//----

//----
return ( 0 );
}
 int start()
{
//----
int Count= 0 ;
double b0,b1;
int ticket;

// параметры индикатора
int SF = 5 ; // original 5
int RSI_Period = 14 ; // original 14
double DARFACTOR = 4.236 ; //original 4.236

//------------ Параметры из индикатора QQEA -----------------------
// Buffer0 -- красная жирная
string Buffer0 = iCustom ( NULL , 0 , "QQEA" , SF, RSI_Period, DARFACTOR, 0 , 0 ); 
// Buffer1 -- жёлтый пунктир
string Buffer1 = iCustom ( NULL , 0 , "QQEA" , SF, RSI_Period, DARFACTOR, 1 , 0 );

b0= StrToDouble (Buffer0);
b1= StrToDouble (Buffer1);


double Lot=GetLot(MaxRisk);

// если лот <0 выводим сообщение об ошибке
if (Lot== 0 ) 
{
Alert ( "Недостаточно средств!" );
return ( 0 );
} 

if (Lot!= 0 && b0>b1) // если лот <> 0 и красная выше жёлтой
{
ticket=NewOrder(OP_BUY,Lot);
if (ExistOrders( Symbol (), 1 , 888 , 0 ) == true ) // проверяем наличие ордера sell
{
CloseOrder();
}
}

if (Lot!= 0 && b0<b1) // если лот <> 0 и красная выше жёлтой
{
ticket=NewOrder(OP_SELL,Lot);
if (ExistOrders( Symbol (), 0 , 888 , 0 ) == true ) // проверяем наличие ордера buy
{
CloseOrder();
}
} 

Comment ( "Red line: " ,b0, "Yellow line: " ,b1);
return ( 0 );
}
//-------------------------------------------------------------
//расчёт лота

double GetLot( int Risk)
{ double Free = AccountFreeMargin ();
double One_Lot = MarketInfo ( Symbol (),MODE_MARGINREQUIRED);
double Min_Lot = MarketInfo ( Symbol (),MODE_MINLOT);
double Max_Lot = MarketInfo ( Symbol (),MODE_MAXLOT);
double Step = MarketInfo ( Symbol (),MODE_LOTSTEP);
double Lot = MathFloor (Free*Risk/ 100 /One_Lot/Step)*Step;
if (Lot<Min_Lot) Lot=Min_Lot;
if (Lot>Max_Lot) Lot=Max_Lot;
if (Lot*One_Lot>Free) return ( 0.0 );
return (Lot);}


bool ExistOrders( string sy= "" , int op=- 1 , int Magic=- 1 , datetime ot= 0 )
{
int i, k= OrdersTotal (), ty;

if (sy== "0" ) sy= Symbol ();
for (i= 0 ; i<k; i++) {
if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
ty= OrderType ();
if (ty> 1 && ty< 6 ) {
if (( OrderSymbol ()==sy || sy== "" ) && (op< 0 || ty==op)) {
if (Magic< 0 || OrderMagicNumber ()==Magic) {
if (ot<= OrderOpenTime ()) return (True);
}
}
}
}
}
return (False);
}


//открытие нового ордера
int NewOrder( int Cmd, double Lot)
{ double TP= 0 ; //тейкпрофит
double SL= 0 ; //стоплосс
double PR= 0 ; //Цена
while (! IsTradeAllowed ()) Sleep ( 100 );
if (Cmd==OP_BUY)
{PR=Ask;
if (TakeProfit> 0 ) TP=Ask+TakeProfit* Point ;
if (StopLoss> 0 ) SL=Ask-StopLoss* Point ;}
if (Cmd==OP_SELL)
{PR=Bid;
if (TakeProfit> 0 ) TP=Bid-TakeProfit* Point ;
if (StopLoss> 0 ) SL=Bid+StopLoss* Point ;}
int tic= OrderSend ( Symbol (),Cmd,Lot,PR, 3 ,SL,TP, " " , 0 , 0 , Green );
if (tic< 0 ) Print ( "Ошибка открытия ордера: " , GetLastError ());
return (tic);}


// закрытие ордера
void CloseOrder()
{ double PR= 0 ;
while (! IsTradeAllowed ()) Sleep ( 100 );
if ( OrderType ()==OP_BUY) PR=Bid;
if ( OrderType ()==OP_SELL) PR=Ask;
if (! OrderClose ( OrderTicket (), OrderLots (),PR, 3 , Red ))
Print ( "Ошибка закрытия ордера: " , GetLastError ());
return ;}
파일:
qqea_1.mq4  4 kb
 
PAZITIV :

QQEA 지표를 기반으로 Expert Advisor를 작성하고 있습니다. 일반적으로 어드바이저의 아이디어는 다음과 같습니다. 빨간색 선이 노란색 선을 아래에서 위로 교차할 때 빨간색 선이 노란색 선을 위에서 아래로 교차 하나 의 매수 주문을 열어야 합니다. 판매용. 하지만 주문을 하나만 열 수는 없습니다. 조건이 충족되는 동안 주문이 열립니다. 예, 구매 주문만 CHYADNT에서 찢어집니다!

//

고문 코드

 //--- input parameters
extern double MaxRisk= 1.0 ;
extern double FixLot = 0.01 ;
extern double Exponent= 2.0 ;
extern int Magic= 888 ;

// костыли

extern int TakeProfit= 100 ;
extern int StopLoss= 100 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Count= 0 ;
   double b0,b1;
   int ticket;

// параметры индикатора
   int SF= 5 ; // original 5
   int RSI_Period= 14 ; // original 14
   double DARFACTOR= 4.236 ; //original 4.236

//------------ Параметры из индикатора QQEA -----------------------
// Buffer0 -- красная жирная
   string Buffer0= iCustom ( NULL , 0 , "QQEA" ,SF,RSI_Period,DARFACTOR, 0 , 0 );
// Buffer1 -- жёлтый пунктир
   string Buffer1= iCustom ( NULL , 0 , "QQEA" ,SF,RSI_Period,DARFACTOR, 1 , 0 );

   b0= StrToDouble (Buffer0);
   b1= StrToDouble (Buffer1);


   double Lot=GetLot(MaxRisk);
// если лот <0 выводим сообщение об ошибке
   if (Lot== 0 )
     {
       Alert ( "Недостаточно средств!" );
       return ( 0 );
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if (Lot!= 0 && b0>b1) // если лот <> 0 и красная выше жёлтой
     {
      ticket=NewOrder(OP_BUY,Lot);
       if (ExistOrders( Symbol (), 1 , 888 , 0 )==true) // проверяем наличие ордера sell
        {
         CloseOrder();
        }
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if (Lot!= 0 && b0<b1) // если лот <> 0 и красная выше жёлтой
     {
      ticket=NewOrder(OP_SELL,Lot);
       if (ExistOrders( Symbol (), 0 , 888 , 0 )==true) // проверяем наличие ордера buy
        {
         CloseOrder();
        }
     }

   Comment ( "Red line: " ,b0, "Yellow line: " ,b1);
   return ( 0 );
  }
//-------------------------------------------------------------
//расчёт лота

double GetLot( int Risk)
  {
   double Free= AccountFreeMargin ();
   double One_Lot = MarketInfo ( Symbol (),MODE_MARGINREQUIRED);
   double Min_Lot = MarketInfo ( Symbol (),MODE_MINLOT);
   double Max_Lot = MarketInfo ( Symbol (),MODE_MAXLOT);
   double Step= MarketInfo ( Symbol (),MODE_LOTSTEP);
   double Lot = MathFloor (Free*Risk/ 100 /One_Lot/Step)*Step;
   if (Lot<Min_Lot) Lot=Min_Lot;
   if (Lot>Max_Lot) Lot=Max_Lot;
   if (Lot*One_Lot>Free) return ( 0.0 );
   return (Lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ExistOrders( string sy= "" , int op=- 1 , int Magic=- 1 , datetime ot= 0 )
  {
   int i,k= OrdersTotal (),ty;

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++)
       //+------------------------------------------------------------------+
       //|                                                                  |
       //+------------------------------------------------------------------+
     {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
        {
         ty= OrderType ();
         if (ty> 1 && ty< 6 )
           {
             if (( OrderSymbol ()==sy || sy== "" ) && (op< 0 || ty==op))
              {
               if (Magic< 0 || OrderMagicNumber ()==Magic)
                 {
                   if (ot<= OrderOpenTime ()) return (True);
                 }
              }
           }
        }
     }
   return (False);
  }
//открытие нового ордера
int NewOrder( int Cmd, double Lot)
  {
   double TP= 0 ; //тейкпрофит
   double SL= 0 ; //стоплосс
   double PR= 0 ; //Цена
   while (! IsTradeAllowed ()) Sleep ( 100 );
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if (Cmd==OP_BUY)
     {
      PR=Ask;
       if (TakeProfit> 0 ) TP=Ask+TakeProfit* Point ;
       if (StopLoss> 0 ) SL=Ask-StopLoss* Point ;
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if (Cmd==OP_SELL)
     {
      PR=Bid;
       if (TakeProfit> 0 ) TP=Bid-TakeProfit* Point ;
       if (StopLoss> 0 ) SL=Bid+StopLoss* Point ;
     }
   if (GetOrdersCount(Magic,Cmd)> 0 ) return ( 0 );
   int tic= OrderSend ( Symbol (),Cmd,Lot,PR, 3 ,SL,TP, " " , 0 , 0 , Green );
   if (tic< 0 ) Print ( "Ошибка открытия ордера: " , GetLastError ());
   return (tic);
  }
// закрытие ордера
void CloseOrder()
  {
   double PR= 0 ;
   while (! IsTradeAllowed ()) Sleep ( 100 );
   if ( OrderType ()==OP_BUY) PR=Bid;
   if ( OrderType ()==OP_SELL) PR=Ask;
   if (! OrderClose ( OrderTicket (), OrderLots (),PR, 3 , Red ))
       Print ( "Ошибка закрытия ордера: " , GetLastError ());
   return ;
  }
//+------------------------------------------------------------------+
// подсчет кол-ва открытых позиций
int GetOrdersCount( int MagicNumber, int Type)
  {
   int count= 0 ;

   for ( int i= 0 ; i< OrdersTotal (); i++)
     {
       // already closed
       if ( OrderSelect (i,SELECT_BY_POS)==false) continue ;
       // not current symbol
       if ( OrderSymbol ()!= Symbol ()) continue ;
       // order was opened in another way
       if ( OrderMagicNumber ()!=MagicNumber) continue ;

       if ( OrderType ()==Type)
        {
         count++;
        }
     }

   return (count);
  }
//-------------------------------------------------------
더 읽기 쉽게 작성하십시오. 나중에 더 쉬울 것입니다.
 
PAZITIV :

QQEA 지표를 기반으로 Expert Advisor를 작성하고 있습니다. 일반적으로 어드바이저의 아이디어는 다음과 같습니다. 빨간색 선이 노란색 선을 아래에서 위로 교차할 때 빨간색 선이 노란색 선을 위에서 아래로 교차 하나 의 매수 주문을 열어야 합니다. 판매용. 하지만 주문을 하나만 열 수는 없습니다. 조건이 충족되는 동안 주문이 열립니다. 예, 그리고 구매 주문만 CHAYDNT에서 찢어집니다!

//

고문 코드


문의할 수 있게 해주세요

문자열 유형 이 사용되는 이유는 무엇입니까?

 //------------ Параметры из индикатора QQEA -----------------------
// Buffer0 -- красная жирная
   string Buffer0= iCustom ( NULL , 0 , "QQEA" ,SF,RSI_Period,DARFACTOR, 0 , 0 );
// Buffer1 -- жёлтый пунктир
   string Buffer1= iCustom ( NULL , 0 , "QQEA" ,SF,RSI_Period,DARFACTOR, 1 , 0 );
[삭제]  
   double diMA60= iMA ( NULL , 60 ,Period_indikatora1, 0 ,Mod_MA, PRICE_CLOSE ,sdvig);
   double diMA30= iMA ( NULL , 30 ,Period_indikatora2, 0 ,Mod_MA, PRICE_CLOSE ,sdvig)

여러분, 어드바이저는 두 개의 다른 시간 프레임(30 및 60)을 사용합니다. 어드바이저를 테스트하라고 알려주세요. 테스터에서 설정하는 기간은? 그리고 EA의 기간은 테스트를 변경하지 않습니다???

 
최소값 이상, 즉 귀하의 경우 M30
[삭제]  

이러한 로그 항목은 무엇을 의미합니까?

2012.01.31 14:34:45 메모리 처리기: 10436536바이트의 메모리를 할당할 수 없습니다.

2012.01.31 14:34:45 HistoryBase: 메모리 'EURGBP1'이 충분하지 않습니다. [206996막대]

? 문제가 있는 경우 수정이 가능한가요?

 

배열을 도와주세요. 내가 원하는 방식으로 작동하지 않습니다.

가격 배열 p[]가 있습니다. 하나의 요소보다 짧은 길이를 갖는 새 배열을 생성해야 하며 첫 번째 배열에서 인접한 두 요소의 차이로 계산됩니다. 차이가 음수이면 -1을 곱합니다.

p[6]={1, 5, 9, 4, 6, 2, 3}

반드시 받아야 함

p_diff[5] = {-1*(1-5), -1*(5-9), 9-4, -1*(4-6), 6-2, -1*(2-3)} 저것들. p_diff[5] = {4, 4, 5, 2, 4, 1}

 int start()
{
   if ( !NewBar() ) return ( 0 );                                           
   int i, n, k,
      j = 0 ;                             
   for (i= 0 ; i<=Bars_count; i++)
  {
      ZZ[i]= iCustom ( NULL , 0 , "ZigZag" ,ExtDepth,ExtDeviation,ExtBackstep, 0 ,i);  
       if (ZZ[i]!= 0 ) 
      {
         Print (ZZ[j]);
         j = j + 1 ;
         k = j - 1 ;
         Print ( "index = " ,k);
      }
  }
   Print ( "iiii = " , k);
   for (n = 0 ; n <= k- 1 ; n++)
  { 
      ZZ_diff[n] = (ZZ[n] -ZZ[n+ 1 ]);
       if (ZZ_diff[n] < 0 )  
         ZZ_diff[n] = ZZ_diff[n] * (- 1 );
       Print (ZZ_diff[n], "   index diff = " , n);
  }
return ( 0 );
}
 
-Aleksey- :

이러한 로그 항목은 무엇을 의미합니까?

2012.01.31 14:34:45 메모리 처리기: 10436536바이트의 메모리를 할당할 수 없습니다.

2012.01.31 14:34:45 HistoryBase: 메모리 'EURGBP1'이 충분하지 않습니다. [206996막대]

? 문제가 있는 경우 수정이 가능한가요?


RAM을 늘리고 최대값을 줄입니다. 창에 바.
 
gince :

배열을 도와주세요. 내가 원하는 방식으로 작동하지 않습니다.

가격 배열 p[]가 있습니다. 길이가 한 요소 더 적고 첫 번째 배열에서 인접한 두 요소의 차이로 계산되는 새 배열을 생성해야 합니다. 차이가 음수이면 -1을 곱합니다.

p[6]={1, 5, 9, 4, 6, 2, 3}

반드시 받아야 함

p_diff[5] = {-1*(1-5), -1*(5-9), 9-4, -1*(4-6), 6-2, -1*(2-3)} 저것들. p_diff[5] = {4, 4, 5, 2, 4, 1}

이중 MathAbs ( 이중 값)

함수는 전달된 숫자 의 절대값 (모듈러스 값)을 반환합니다.

ZZ_diff[n] = MathAbs (ZZ[n] -ZZ[n+ 1 ]);
 
double zz_arr[1000];
double preZz=0;
int i,ii;
for(i=5000;i>=0;i--){
   double zz = iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i); 
   if(zz!=0){
      if(preZz==0){preZz=zz;continue;}
      zz_arr[ii]=MathAbs(zz-preZz);
      preZz=zz;
      ii++;
   }
}
ArrayResize(zz_arr,ii);