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

 
ZZZEROXXX :


위로. 어드바이저를 한마디로 스크립트로 바꾸는 원리에 감사드립니다

그게 더 쉽습니다.
 
ZZZEROXXX :


위로. 어드바이저를 한마디로 스크립트로 바꾸는 원리에 감사드립니다


잘은 모르겠지만 어드바이저가 대본으로 옮기면 대본처럼 될 것 같다.
 
ZZZEROXXX :


위로. 어드바이저를 한마디로 스크립트로 바꾸는 원리에 감사드립니다

그리고 스크립트는 무엇을 줄 것입니까?

일반적으로 터미널은 네트워크에서 연결 해제되고 CSV 파일은 비표준 시간 프레임에서 작성된 다음 기호 및 마침표 대신 로드되며 이 기간에 테스트가 수행됩니다. 시가 에서는 사실이지만 다른 옵션은 많지 않습니다.

 
splxgf :

그리고 스크립트는 무엇을 줄 것입니까?

일반적으로 터미널은 네트워크에서 연결 해제되고 CSV 파일은 비표준 시간 프레임에서 작성된 다음 기호 및 마침표 대신 로드되며 이 기간에 테스트가 수행됩니다. 시가에서는 사실이지만 다른 옵션은 많지 않습니다.


응답해주신 모든 분들께 감사드립니다. TF 대체 옵션이 마음에 듭니다. 시도해 보겠습니다. 처음에는 비표준 TF를 자율적으로 열고 스크립트 어드바이저를 던져서 파일에 거래를 업로드할 계획이었습니다.
 

뭐:

    1. 최대 감소율, % — 최대 감소율(%).

?

전략 옵티마이저에서 이러한 매개변수를 지정할 수 있지만 의미가 명확하지 않습니다...

1) 이것은 원래 예금 대비 최대 잔고 감소입니까?

2) 다음 주식의 고가와 저가의 최대 차이는 얼마입니까?

3) 최소 마진과 최대 마진의 차이는?

그리고 더 많은 옵션이 떠오릅니다.

단어의 정확한 의미를 설명하십시오 ( 최대 드로다운, %)

 
snail09 :

귀하의 코드를 조사하기 시작했습니다. 놀랐어요. 당신이 게시한 것은 작동하지 않습니다. 조각으로 조립된 것을 볼 수 있지만 적어도 브래킷은 올바르게 배치되었습니다.

코드는 두 부분입니다. .내 전문가다. 좀 봐봐.

 //+------------------------------------------------------------------+
//|                                                      rusa_v4.mq4 |
//|                        
//|                      |
//+------------------------------------------------------------------+
#property copyright ""
#property link       "https://www.mql5.com/ru/users/avoitenko"

//--- Внешние переменные 
extern string General = "=== General settings ===" ;
extern int TakeProfit_Buy  =   260 ; // Тейк профит для Buy
extern int StopLoss_Buy    =   120 ; // Стоп лосс для Buy
extern int TakeProfit_Sell =   140 ; // Тейк профит для Sell
extern int StopLoss_Sell   =   110 ; // Стоп лосс для Sell
extern int TrailingStop    =   0 ; // Трейлинг стоп
extern double Lots         = 0.02 ; // Лот 
extern int Slippage        =   10 ; // Проскальзывание
extern int BarsShift       =     0 ; // Смещение в барах для анализа сигнала

extern int Magic           = 555 ; // Уникальный номер советника


extern string MA1 = "=== #1 Moving Average settings ===" ;
extern int MA1_period      = 1 5 ; // Период скользящей средней 
extern int MA1_shift       = 0 ;   // Смещение скользящей средней 
extern int MA1_method      = 1 ;   // MODE_SMA=0,MODE_EMA=1,MODE_SMMA=2,MODE_LWMA =3;
extern int MA1_price       = 2 ;   // PRICE_CLOSE=0,PRICE_OPEN=1,PRICE_HIGH=2,PRICE_LOW=3,PRICE_MEDIAN=4,PRICE_TYPICAL=5,PRICE_WEIGHTED=6;

extern string MA2 = "=== #2 Moving Average settings ===" ;
extern int MA2_period      = 2 0 ; 
extern int MA2_shift       = 0 ; 
extern int MA2_method      = 0 ; 
extern int MA2_price       = 0 ;

extern string MA3 = "=== #3 Moving Average settings ===" ;
extern int MA3_period      = 70;
extern int MA3_shift       = 8 ; 
extern int MA3_method      = 2 ;
extern int MA3_price       = 3 ;

extern string RSI = "=== RSI settings ===" ;
extern int RSI_period      = 14 ; // Период RSI
extern int RSI_price       =   3 ; // PRICE_CLOSE=0,PRICE_OPEN=1,PRICE_HIGH=2,PRICE_LOW=3,PRICE_MEDIAN=4,PRICE_TYPICAL=5,PRICE_WEIGHTED=6;

extern int macd_fast             = 12 ;
extern int macd_slow             = 15 ;
extern int macd_signal                  = 1 ;
extern int macd_price                   = 3 ; // 0-PRICE_CLOSE, 1-PRICE_OPEN, 2-PRICE_HIGH, 3-PRICE_LOW, 4-PRICE_MEDIAN, 5-PRICE_TYPICAL, 6-PRICE_WEIGHTED
extern int macd_open             = 7 ;
//--- Глобальные переменные
double lot;             // лот

double ma10,ma20,ma30,ma11,ma21,ma31,rsi, macd;

int stop_loss_buy;       // стоп лосс
int take_profit_buy;     // тейк профит

int stop_loss_sell;     // стоп лосс
int take_profit_sell;   // тейк профит

int slippage;           // проскальзывание
int trailing_stop;       // трейлинг стоп

int min_level;           // минимальный отступ от цены для установки SL / TP

int bars_shift;         // смещение в барах для торговых сигналов
int bars_count;         // минимальное число баров для работы
datetime candle_time = 0 ;   

bool sell_open = false; // флаг открытия позиции sell
bool buy_open  = false; // флаг открытия позиции buy

bool new_bar_buy = false;   // флаг нового бара
bool new_bar_sell = false; // флаг нового бара

//+------------------------------------------------------------------+
int init()
//+------------------------------------------------------------------+
  {
   //--- проверка правильности ввода данных
   bars_shift = BarsShift;
   if (bars_shift < 0 )bars_shift = 0 ;
   
   bars_count = MathMax4(MA1_period, MA2_period, MA3_period, RSI_period) + bars_shift;

   //--- инициализация переменных
   stop_loss_buy     = StopLoss_Buy;
   take_profit_buy   = TakeProfit_Buy;
   stop_loss_sell    = StopLoss_Sell;
   take_profit_sell  = TakeProfit_Sell;
   slippage          = Slippage;
   trailing_stop     = TrailingStop;

   //--- Если цена состоит из 3-x / 5-и цифр
   if (( Digits == 3 ) || ( Digits == 5 ))
    {
      stop_loss_buy     = stop_loss_buy * 10 ;
      take_profit_buy   = take_profit_buy * 10 ;
      stop_loss_sell    = stop_loss_sell * 10 ;
      take_profit_sell  = take_profit_sell * 10 ;
      slippage          = slippage * 10 ;
      trailing_stop     = trailing_stop * 10 ;
    }

   Print ( "Советник начал свою работу" );
   return ( 0 );
  }
bool macd_up( int timeframe, int fast, int slow, int signal, int price, int num) {
 double y;
 double x = iMACD ( NULL ,timeframe,fast,slow,signal,price,MODE_MAIN, 0 )* 100000 ;
 for ( int i= 1 ; i<num; i++) {
  y = iMACD ( NULL ,timeframe,fast,slow,signal,price,MODE_MAIN,i)* 100000 ;
   if (y > x) return (false);
   else x = y;
 }
 return (true);
}
 
//+------------------------------------------------------------------+
bool macd_down( int timeframe, int fast, int slow, int signal, int price, int num) {
 double y;
 double x = iMACD ( NULL ,timeframe,fast,slow,signal,price,MODE_MAIN, 0 )* 100000 ;
 for ( int i= 1 ; i<num; i++) {
  y = iMACD ( NULL ,timeframe,fast,slow,signal,price,MODE_MAIN,i)* 100000 ;
   if (y < x) return (false);
   else x = y;
 }
 return (true);
}
//+------------------------------------------------------------------+

int deinit()
//+------------------------------------------------------------------+
  {
   Print ( "Советник завершил свою работу" );
   return ( 0 );
  }

//+------------------------------------------------------------------+
int start()
//+------------------------------------------------------------------+
  {
   
   //--- Разрешение на открытие позиций - каждую свечу
   if (candle_time != Time[ 0 ])
   {
      candle_time  = Time[ 0 ];  
      new_bar_buy  = true;
      new_bar_sell = true;
   }
   
   if ( Bars < bars_count){ Print ( "Мало данных для работы" ); return ( 0 );}

   //--- Получение значений индикатора iMA
   ma10 = iMA ( Symbol (), Period (), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift);
   ma20 = iMA ( Symbol (), Period (), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift);
   ma30 = iMA ( Symbol (), Period (), MA3_period, MA3_shift, MA3_method, MA3_price, bars_shift);

   ma11 = iMA ( Symbol (), Period (), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift+ 1 );
   ma21 = iMA ( Symbol (), Period (), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift+ 1 );
   
   rsi = iRSI ( Symbol (), Period (), RSI_period, RSI_price, bars_shift);
  macd = iMACD ( NULL , 0 ,macd_fast,macd_slow,macd_signal,macd_price,MODE_MAIN, 0 );
   
  
   {
       if (macd < 0 )
        {
         if (macd_down( 0 ,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return (true);
       
      {
         //--- Условие для продажи
         if (ma11 < ma21 && ma10 > ma20 && ma30 > ma10 && rsi< 50   && new_bar_sell)
         {
            sell_open=true;
            new_bar_sell = false;
         }
          }
           }
            }
      {
        
      
       if (macd >   0 )
       {
       if (macd_up( 0 ,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return (true);
  {
         //--- Условие для продажи
           if (ma11 > ma21 && ma10 < ma20 && ma30 < ma10 && rsi> 50 && new_bar_buy)
         {
            buy_open=true;
            new_bar_buy = false;
          }
      }
   }
    }
 {
         if (macd >   0 )
       {
       if (macd_up( 0 ,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return (true);
   {
       //--- Условие для покупки
       if (ma11 < ma21 && ma10 > ma20 && ma30 > ma10 && rsi> 50   && new_bar_buy)
      {
         buy_open=true;
         new_bar_buy = false;
      }
   }
     }
     {
       if (macd < 0 )
        {
         if (macd_down( 0 ,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return (true);
     { //--- Условие для продажи
       if (ma11 > ma21 && ma10 < ma20 && ma30 < ma10 && rsi< 50   && new_bar_sell)
      {
         sell_open=true;
         new_bar_sell = false;
      }
   }
}
 }  
 }  
     //--- выставление рыночных ордеров
  
   if ( IsTradeAllowed ())
   {
      Trade_BUY();
      Trade_SELL();      
   }

   return ( 0 );
  }


 
rusa :

두 번째 부분

 //+------------------------------------------------------------------+
void Trade_BUY() 
//+------------------------------------------------------------------+
{ 

   for ( int i = 0 ; i < OrdersTotal (); i++ ) 
   {
      
       if ( OrderSelect ( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         
         if (( OrderSymbol () != Symbol ()) || ( OrderMagicNumber () != Magic)) continue ; //не наш ордер
         
         if ( OrderType () == OP_BUY)   // если ордер OP_BUY
         {
          
            min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );
            
             //--- проверка на работу трейлинг стопа
             if (trailing_stop != 0.0 && Ask > NormalizeDouble ( OrderStopLoss () + (stop_loss_buy + MathMax (min_level, trailing_stop)) * Point , Digits ) && OrderProfit () > 0 ) 
            {

               if ( OrderModify ( OrderTicket (), OrderOpenPrice (), 
                   NormalizeDouble ( OrderStopLoss () + MathMax (min_level, trailing_stop) * Point , Digits ),
                   OrderTakeProfit (),   0 , CLR_NONE ))
               {
                   Print ( "Сработал трейлинг стоп для Buy" );
               }
               else 
               {
                   Print ( "Ошибка модификации ордера #" , GetLastError ());
               }           

               RefreshRates ();
               Sleep ( 3000 );
            } //end modify 

         } // end BUY
      
      } //end OrderSelect    
       else
      {
         Print ( "OrderSelect ошибка #" ,   GetLastError () ); 
         Sleep ( 3000 );
         RefreshRates ();   
         return ;
      } 
   
   } // end for
 
    
   //--- Открываем ордер если есть сигнал
   while (buy_open) 
   { 

       //--- нормализация лота
      lot = Normalize_Lot(Lots);
   
       //--- проверка на наличие свободной маржи
       if ( AccountFreeMarginCheck ( Symbol (),OP_BUY, lot) <= 0 || GetLastError () == 134 )
      {
         Print ( "Недостаточно свободной маржи для открытия ордера" );
         buy_open = false;
         break ;
      }
   
      min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );
      
       if ( OrderSend ( Symbol (), OP_BUY, lot, NormalizeDouble (Ask, Digits ), slippage, 
             NormalizeDouble (Bid - MathMax (stop_loss_buy, min_level) * Point , Digits ),
             NormalizeDouble (Bid + MathMax (take_profit_buy,min_level) * Point , Digits ),
             DoubleToStr (Magic, 0 ), Magic, 0 , Blue ) > 0 )
      {
             PlaySound ( "Wait.wav" );
            buy_open = false; // ордер открыт
             break ;
      }
      
       else
      {
             int Error = GetLastError ();                 // Не получилось :(
         
             switch (Error)                             // Преодолимые ошибки
            {
             case 138 : Alert ( "Ошибка: " ,Error, " Новые цены." );
               RefreshRates ();                     
               continue ;                          
             case 135 : Alert ( "Ошибка: " ,Error, " Цена изменилась." );
               RefreshRates ();                    
               continue ;                          
             case 136 : Alert ( "Нет цен." );
               while ( RefreshRates () == false)     
               Sleep ( 500 );                        
               continue ;                          
             case 146 : Alert ( "Подсистема торговли занята." );
               Sleep ( 500 );                        
               RefreshRates ();                    
               continue ; 
             default : Alert ( "Возникла ошибка " , Error, " Выход из подпрограммы." ); // Другие варианты ошибок
               
            } // end switch
         
      } // end else
      
       break ;
   
   } // end while
   
} // end Trade_BUY
       
//+------------------------------------------------------------------+
void Trade_SELL() 
//+------------------------------------------------------------------+
{

   
   for ( int i = 0 ; i < OrdersTotal (); i++ ) 
   {
      
       if ( OrderSelect ( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         
         if (( OrderSymbol () != Symbol ()) || ( OrderMagicNumber () != Magic)) continue ; //не наш ордер
         
         if ( OrderType () == OP_SELL) //если ордер OP_SELL
         {
            min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );

             //--- проверка на работу трейлинг стопа
             if (trailing_stop != 0.0 && Bid < NormalizeDouble ( OrderStopLoss () - (stop_loss_sell + MathMax (min_level, trailing_stop)) * Point , Digits )&& OrderProfit () > 0 ) 
            {   
               if ( OrderModify ( OrderTicket (), OrderOpenPrice (), 
                   NormalizeDouble ( OrderStopLoss () - MathMax (min_level, trailing_stop) * Point , Digits ),
                   OrderTakeProfit (), 0 , CLR_NONE ))
               {
                   Print ( "Сработал трейлинг стоп для Sell" );
               }
               else 
               {
                   Print ( "Ошибка модификации ордера #" , GetLastError ());
               }           

               RefreshRates ();
               Sleep ( 3000 );
           
            }          
         } // end BUY
      
      } //end OrderSelect    
       else
      {
         Print ( "OrderSelect ошибка #" ,   GetLastError () ); 
         Sleep ( 3000 );
         RefreshRates ();   
         return ;
      } 
   
   } // end for
 
    
   //--- Открываем ордер если есть сигнал
   while (sell_open) 
   { 

       //--- нормализация лота
      lot = Normalize_Lot(Lots);
   
       //--- проверка на наличие свободной маржи
       if ( AccountFreeMarginCheck ( Symbol (),OP_SELL, lot) <= 0 || GetLastError () == 134 )
      {
         Print ( "Недостаточно свободной маржи для открытия ордера" );
         sell_open = false;
         break ;
      }
   
      min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );
      
       if ( OrderSend ( Symbol (), OP_SELL, lot, NormalizeDouble (Bid, Digits ), slippage, 
             NormalizeDouble (Ask + MathMax (stop_loss_sell, min_level) * Point , Digits ),
             NormalizeDouble (Ask - MathMax (take_profit_sell, min_level) * Point , Digits ),
             DoubleToStr (Magic, 0 ), Magic, 0 , Red ) > 0 )
      {
             PlaySound ( "Wait.wav" );
            sell_open = false; // ордер открыт
             break ;
      }
      
       else
      {
             int Error = GetLastError ();                 // Не получилось :(
         
             switch (Error)                             // Преодолимые ошибки
            {
             case 138 : Alert ( "Ошибка: " ,Error, " Новые цены." );
               RefreshRates ();                     
               continue ;                          
             case 135 : Alert ( "Ошибка: " ,Error, " Цена изменилась." );
               RefreshRates ();                    
               continue ;                          
             case 136 : Alert ( "Нет цен." );
               while ( RefreshRates () == false)     
               Sleep ( 500 );                        
               continue ;                          
             case 146 : Alert ( "Подсистема торговли занята." );
               Sleep ( 500 );                        
               RefreshRates ();                    
               continue ; 
             default : Alert ( "Возникла ошибка " , Error, " Выход из подпрограммы." ); // Другие варианты ошибок
               
            } // end switch
         
      } // end else
      
       break ;
   
   } // end while
   
} // end Trade_SELL


//+------------------------------------------------------------------+
double Normalize_Lot( double lot) // Проверка на допустимое значение лота
//+------------------------------------------------------------------+
{
   double lot_min  = MarketInfo ( Symbol (), MODE_MINLOT);
   double lot_max  = MarketInfo ( Symbol (), MODE_MAXLOT);
   double lot_step = MarketInfo ( Symbol (), MODE_LOTSTEP);
   
   if ( lot <= lot_min ) lot = lot_min;       // минимальный
   else if ( lot >= lot_max ) lot = lot_max; // максимальный
   else lot = MathFloor ( lot / lot_step ) * lot_step ; // округление до ближайшего меньшего
   
   return (lot);
}

//+------------------------------------------------------------------+
int MathMax4( int i1, int i2, int i3, int i4) // Возврат максимального значения
//+------------------------------------------------------------------+
{
   int imax=i1;
   if (i2>imax)imax=i2;
   if (i3>imax)imax=i3;
   if (i4>imax)imax=i4;
   return (imax);
}
 
설정된 주문 중 하나가 작동한 경우 보류 중인 주문을 삭제하는 방법을 알려주십시오. 총 2개의 보류 중인 항목이 설정됩니다.
 
ArgentumZ :

안녕하세요!

테스터에서 EA를 실행하고 있습니다. 서버는 4자리입니다. 매수 또는 매도 주문을 할 때 저널은 다음과 같이 씁니다.

2011.10.23 15:27:26 2010.12.16 06:16 test_sovetnik GBPUSD,H1: 오픈 #1 매수 0.10 GBPUSD에서 1.5551 sl: 1.4551 tp: 1.5586 ok

하지만 1.55512의 가격으로 오픈!!! 다섯 자리입니다. 또한 지연은 네 자리에 따라 배치되고 네 자리에 따라 작동합니다. 하지만 OP_SELL과 OP_BUY - 5자리만 열 수 있습니다!

나는 NormalizeDouble(Ask, Digits)을 합니다.

아무것도 도움이되지 않습니다! 이 문제를 해결하는 방법을 알려주시겠습니까?

물론 마지막 기호를 무시할 수 있습니다. 오류는 충돌하지 않지만 실험의 순수성을 위해 모든 거래가 4자리로 종료되어야 합니다.


아마도 귀하의 MT4와 서버에는 저와 같은 5자리 견적이 있을 것입니다. 따라서 모든 것에 10을 곱해야 합니다. 숫자 = 5.
 
Parn25 :
설정된 주문 중 하나가 작동한 경우 보류 중인 주문을 삭제하는 방법을 알려주십시오. 총 2개의 보류 중인 항목이 설정됩니다.

수동으로 수행할 수 있습니다. 마우스 오른쪽 버튼을 클릭하고 더 많이... :)

스크립트나 어드바이저를 사용할 수 있습니다. 당신은 무엇을 더 좋아합니까? XD