포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 287

 
artmedia70 :

이 상황에서 코드에 추가해야 합니다. Appled_Price와 같은 외부 변수를 만듭니다.

그리고 코드에서 모든 PRICE_CLOSE를 Appled_Price로 변경합니다.


아, 예, 죄송합니다. 새 빌드에 대해 이야기하고 있는데 코드가 약간 이상합니다.

그것이 바로 요점입니다. 코드에는 무료 가격이 없으며 모든 것이 배열에 있으며 어리석게 교체하는 것은 불가능합니다. 시도했습니다 (((

그리고 그렇게하더라도 드롭 다운 목록에서 어떻게 선택합니까 (내 질문의 그림과 같이)?


 //+------------------------------------------------------------------+
//|                                       Custom Moving Averages.mq4 |
//|                   Copyright 2005-2013, MetaQuotes Software Corp. |
//|                                              https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2013, MetaQuotes Software Corp."
#property link         "https://www.mql4.com"
#property description "Moving Average"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//--- indicator parameters
input int             InpMAPeriod= 13 ;         // Period
input int             InpMAShift= 0 ;           // Shift
input ENUM_MA_METHOD InpMAMethod= MODE_SMA ;   // Method
//--- indicator buffer
double ExtLineBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ( void )
  {
   string short_name;
   int     draw_begin=InpMAPeriod- 1 ;
//--- indicator short name
   switch (InpMAMethod)
     {
       case MODE_SMA   : short_name= "SMA(" ;                 break ;
       case MODE_EMA   : short_name= "EMA(" ;  draw_begin= 0 ; break ;
       case MODE_SMMA : short_name= "SMMA(" ;               break ;
       case MODE_LWMA : short_name= "LWMA(" ;               break ;
       default :         return (INIT_FAILED);
     }
   IndicatorShortName(short_name+ string (InpMAPeriod)+ ")" );
   IndicatorDigits( Digits );
//--- check for input
   if (InpMAPeriod< 2 )
       return (INIT_FAILED);
//--- drawing settings
   SetIndexStyle( 0 , DRAW_LINE );
   SetIndexShift( 0 ,InpMAShift);
   SetIndexDrawBegin( 0 ,draw_begin);
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtLineBuffer);
//--- initialization done
   return (INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|  Moving Average                                                  |
//+------------------------------------------------------------------+
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[])
  {
//--- check for bars count
   if (rates_total<InpMAPeriod- 1 || InpMAPeriod< 2 )
       return ( 0 );
//--- counting from 0 to rates_total
   ArraySetAsSeries (ExtLineBuffer, false );
   ArraySetAsSeries (close, false );
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 )
       ArrayInitialize (ExtLineBuffer, 0 );
//--- calculation
   switch (InpMAMethod)
     {
       case MODE_EMA :  CalculateEMA(rates_total,prev_calculated,close);         break ;
       case MODE_LWMA : CalculateLWMA(rates_total,prev_calculated,close);       break ;
       case MODE_SMMA : CalculateSmoothedMA(rates_total,prev_calculated,close); break ;
       case MODE_SMA :  CalculateSimpleMA(rates_total,prev_calculated,close);   break ;
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//|   simple moving average                                          |
//+------------------------------------------------------------------+
void CalculateSimpleMA( int rates_total, int prev_calculated, const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 )
   
     {
      limit=InpMAPeriod;
       //--- calculate first visible value
       double firstValue= 0 ;
       for (i= 0 ; i<limit; i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit- 1 ]=firstValue;
     }
   else
      limit=prev_calculated- 1 ;
//--- main loop
   for (i=limit; i<rates_total && ! IsStopped (); i++)
      ExtLineBuffer[i]=ExtLineBuffer[i- 1 ]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }
//+------------------------------------------------------------------+
//|  exponential moving average                                      |
//+------------------------------------------------------------------+
void CalculateEMA( int rates_total, int prev_calculated, const double &price[])
  {
   int     i,limit;
   double SmoothFactor= 2.0 /( 1.0 +InpMAPeriod);
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 )
     {
      limit=InpMAPeriod;
      ExtLineBuffer[ 0 ]=price[ 0 ];
       for (i= 1 ; i<limit; i++)
         ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i- 1 ]*( 1.0 -SmoothFactor);
     }
   else
      limit=prev_calculated- 1 ;
//--- main loop
   for (i=limit; i<rates_total && ! IsStopped (); i++)
      ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i- 1 ]*( 1.0 -SmoothFactor);
//---
  }
//+------------------------------------------------------------------+
//|  linear weighted moving average                                  |
//+------------------------------------------------------------------+
void CalculateLWMA( int rates_total, int prev_calculated, const double &price[])
  {
   int         i,limit;
   static int weightsum;
   double      sum;
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 )
     {
      weightsum= 0 ;
      limit=InpMAPeriod;
       //--- calculate first visible value
       double firstValue= 0 ;
       for (i= 0 ;i<limit;i++)
        {
         int k=i- 1 ;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=( double )weightsum;
      ExtLineBuffer[limit- 1 ]=firstValue;
     }
   else
      limit=prev_calculated- 1 ;
//--- main loop
   for (i=limit; i<rates_total && ! IsStopped (); i++)
     {
      sum= 0 ;
       for ( int j= 0 ;j<InpMAPeriod;j++)
         sum+=(InpMAPeriod-j)*price[i-j];
      ExtLineBuffer[i]=sum/weightsum;
     }
//---
  }
//+------------------------------------------------------------------+
//|  smoothed moving average                                         |
//+------------------------------------------------------------------+
void CalculateSmoothedMA( int rates_total, int prev_calculated, const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 )
     {
      limit=InpMAPeriod;
       double firstValue= 0 ;
       for (i= 0 ; i<limit; i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit- 1 ]=firstValue;
     }
   else
      limit=prev_calculated- 1 ;
//--- main loop
   for (i=limit; i<rates_total && ! IsStopped (); i++)
      ExtLineBuffer[i]=(ExtLineBuffer[i- 1 ]*(InpMAPeriod- 1 )+price[i])/InpMAPeriod;
//---
  }
//+------------------------------------------------------------------+
 
evillive :

그게 바로 요점입니다. 코드에는 무료 가격이 없습니다. 어리석게 교체하는 것은 불가능합니다(((

여기에서 시도

 switch (InpMAMethod)
     {
       case MODE_EMA :  CalculateEMA(rates_total,prev_calculated,close);         break ;
       case MODE_LWMA : CalculateLWMA(rates_total,prev_calculated,close);       break ;
       case MODE_SMMA : CalculateSmoothedMA(rates_total,prev_calculated,close); break ;
       case MODE_SMA :  CalculateSimpleMA(rates_total,prev_calculated,close);   break ;
     }

오픈에 가깝게 변경합니다. Open으로 카운팅을 시작하면 이 값을 변경하는 방법을 이 방향으로 파십시오. 지금은 터미널의 베타 버전을 실행하여 편집기를 볼 수 없습니다.

먼저 여기를 교체하십시오.

 //--- counting from 0 to rates_total
   ArraySetAsSeries (ExtLineBuffer, false );
   ArraySetAsSeries (close, false );
//--- first calculation or number of bars was changed
 
Close를 Open으로 변경하는 것은 의미가 없습니다. 약간의 변경 사항이 있을 것입니다. 그런 넌센스에 신경 쓰지 않고 형성된 막대에서 데이터를 가져 오는 것이 더 쉽습니다.
 

모두를 환영합니다))

고문 을 썼지만 마침내 작동하지 않습니다))))) 또는 올바르게 작동하지 않습니다. 내가 얼마나 땜질하고, 많이 고쳤지 만, 그럼에도 불구하고 고문은 작동하지 않습니다.

다음은 RSI 지표를 기반으로 한 거래 결정 계산의 일부입니다.

//--------------------데이터--------------------------- ----------

   int Ticket1_RSI=- 1 , Ticket2_RSI=- 1 ;                     // Номера открытых ордеров
   extern double Lot= 0.01 ;                                 // Объем лота
int RSI()                                                   // Функция RSI
   {                                                                                                             
   double T, P;
   double RSI_0, RSI_1, RSI_2;                       // Значения индикатора RSI
//------------------Значения индикатора---------------------------------------   
   RSI_0= iRSI ( Symbol (), 0 , 14 , PRICE_CLOSE , 0 );               // Получаем данные от RSI 
   RSI_1= iRSI ( Symbol (), 0 , 14 , PRICE_CLOSE , 1 );               // Получаем данные от RSI 
   RSI_2= iRSI ( Symbol (), 0 , 14 , PRICE_CLOSE , 2 );               // Получаем данные от RSI 
//------------------Условие на продажу---------------------------------   
   if (RSI_1 > RSI_0 > 70 && RSI_1 > RSI_2)         // Если индикатор превышает значение 70 и виден поворот вниз
      {                                                                                                           
       if (Ticket2_RSI > 0 )                                                     // Если имеется ордер на покупку
         OrderClose(Ticket2_RSI, OrderLots(), Bid, 0 , 0 );                             // Закрытие ордера на покупку
       if (Ticket1_RSI <= 0 )                                                     // Если ордера на продажу нет
         {
         Ticket1_RSI= OrderSend ( Symbol (), OP_SELL, Lot, Bid, 2 , 0 , 0 );         // Открытие ордера на продажу
         if ( OrderSelect (Ticket1_RSI, SELECT_BY_TICKET)== true )
            {
            T=OrderOpenTime();
            P=OrderOpenPrice();
             ObjectCreate ( "Arrow" , 22 , 0 , T, P);               // Создание индикатора ордера
            ObjectSet( "Arrow" , OBJPROP_COLOR , IndianRed);                             // Изменение цвета в мутно-красноватый
            ObjectSet( "Arrow" , OBJPROP_ARROWCODE , 242 );                               // Направление стрелки вниз
             ObjectCreate ( "Text" , 21 , 0 , T, P);                 // Создание текстового объекта
            ObjectSetText( "Text" , "Open sell-order by RSI" , 6 , "Times New Roman" , Navy);     // Текст, шрифт, стиль, цвет     
            }
         }
      }
//-------------------Условие на покупку--------------------------------   
   if (RSI_1 < RSI_0 < 30 &&  RSI_1 < RSI_2)         // Если индикатор ниже значения 30 и виден поворот вверх
      {
       if (Ticket1_RSI > 0 )                                                     // Если имеется ордер на продажу
         OrderClose(Ticket1_RSI, OrderLots(), Ask, 0 , 0 );                             // Закрытие ордера на продажу
       if (Ticket2_RSI <= 0 )                                                     // Если ордера на продажу нет
         {
         Ticket2_RSI= OrderSend ( Symbol (), OP_BUY, Lot, Ask, 2 , 0 , 0 );         // Открытие ордера на покупку
         if ( OrderSelect (Ticket2_RSI, SELECT_BY_TICKET)== true )
            {
            T=OrderOpenTime();
            P=OrderOpenPrice();
             ObjectCreate ( "Arrow" , 22 , 0 , T, P);   // Создание индикатора ордера          
            ObjectSet( "Arrow" , OBJPROP_COLOR , LawnGreen);                             // Изменение цвета в ярко-зеленый
            ObjectSet( "Arrow" , OBJPROP_ARROWCODE , 241 );                               // Направление стрелки вверх
             ObjectCreate ( "Text" , 21 , 0 , T, P);     // Создание текстового объекта
            ObjectSetText( "Text" , "Open buy-order by RSI" , 6 , "Times New Roman" , Navy);       // Текст, шрифт, стиль, цвет
            }
         }   
      }
//--------------------------------------------------------------------   
   return ;    
   } 

사실 고문은 지표의 가치에도 불구하고 즉시 구매 주문을 열고 어떤 식 으로든 닫기를 원하지 않습니다. 텍스트 및 화살표와 같은 개체가 표시되지 않습니다.

도와주세요

 
waroder :

모두를 환영합니다))

고문을 썼지만 마침내 작동하지 않습니다)))) 또는 올바르게 작동하지 않습니다. 내가 얼마나 땜질하고, 많이 고쳤지 만, 그럼에도 불구하고 고문은 작동하지 않습니다.

다음은 RSI 지표를 기반으로 한 거래 결정 계산의 일부입니다.

//--------------------데이터--------------------------- ----------

사실 고문은 지표의 가치에도 불구하고 즉시 구매 주문을 열고 어떤 식 으로든 닫기를 원하지 않습니다. 텍스트 및 화살표와 같은 개체가 표시되지 않습니다.

도와주세요


 if (RSI_1 > RSI_0 && RSI_0 > 70 && RSI_1 > RSI_2)         // Если индикатор превышает значение 70 и виден поворот вниз
 
Vinin :



즉, 조건에서 각 부등식을 별도로 작성해야 합니까? 어떻게든 일반화하면 오류로 인식될까? 그러면 프로그램에서 컴파일할 때 오류가 없다고 말하는 이유는 무엇입니까?
 
waroder :

즉, 조건에서 각 부등식을 별도로 작성해야 합니까? 어떻게든 일반화하면 오류로 인식될까? 그러면 프로그램에서 컴파일할 때 오류가 없다고 말하는 이유는 무엇입니까?

오류는 없습니다. 단지 예상한 결과를 얻지 못할 뿐입니다.
 
hoz :

... 그러한 상황에서 원인을 찾는 방법은 무엇입니까?


우연히 발견했습니다. 단순화할 필요가 있습니다. 모든 것을 주석 처리하고, 첫 번째 import , 컴파일, 함수 호출 등의 주석을 제거하십시오.

 
Integer :
Close를 Open으로 변경하는 것은 의미가 없습니다. 약간의 변경 사항이 있을 것입니다. 그런 넌센스에 신경 쓰지 않고 형성된 막대에서 데이터를 가져 오는 것이 더 쉽습니다.
동의하지만 질문이 있었기 때문에 ...
 
Vinin :

오류는 없습니다. 단지 예상한 결과를 얻지 못할 뿐입니다.


모든)) 여기에서 조금 알아 냈습니다) 한 주문이 추가 변경없이 즉시 열렸습니다.

   RSI_1= iRSI ( Symbol (), 0 , 14 , PRICE_CLOSE , 1 );               // Получаем данные от RSI 

변수 유형에 불일치가 있으므로 Symbol() 대신 NULL을 작성해야 합니다. 이 때문에 RSI 값이 0으로 인식되어 조건이 작동했기 때문에 즉시 열었습니다. 그리고 미래에 RSI는 0이었고 순서는 변경되지 않았습니다.

이제 모든 것이 잘 작동합니다.

그것은 단지 객체가 첫 번째 트랜잭션에서 한 번 생성된다는 것입니다. 그런 다음 개체가 이미 존재한다는 오류가 발생합니다. 각 거래와 함께 차트에 표시할 수 있는 그래픽 개체가 있습니까?