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

 
Andy Dufresne :

안녕하세요. 구조체 배열을 초기화하는 방법을 슬로우팩에 설명합니다. 일반 배열의 경우 모든 것이 간단합니다.

int HiddenFunc[3,2] = {1,2,3,4,5,6};

그러나 구조체 배열은 어떻습니까? 예를 들어 이 구조로 배열을 초기화하십시오.

구조체 MODE_KEY {문자열 키; 부울 법;};

수업처럼:
https://www.mql5.com/ru/docs/basis/types/classes


또는 배열)

 struct trade_settings
  {
   double take;         // значения цены фиксации прибыли
   double stop;         // значение цены защитного стопа
   uchar   slippage;     // значение допустимого проскальзывания
  };



   trade_settings ss[]={
                        { 1.0 , 2.0 , 5 },
                        { 1.0 , 2.0 , 5 },
                        { 1.0 , 2.0 , 5 }
                        };  
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структуры, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

안녕하세요.

올빼미 테스트. (아래에 첨부된 코드).

올빼미. 이전 주문의 이력을 기반으로 마틴게일을 사용합니다(손실이 있는 경우 랏에 마틴 계수를 곱합니다..).

이전 주문은 예를 들어 (martin = 2..)에서 0.2로 많은 스톱으로 마감되었습니다. 그런 다음 MT4 터미널에서 "자동 거래"를 끄거나 터미널과 올빼미를 완전히 끕니다. 거래를 중지합니다.

또한 "자동 거래" 버튼이 켜지면 올빼미가 켜지고 다음 로트가 0.4의 볼륨으로 열립니다.

그래서 "자동 거래"를 끌 때 터미널 자체를 껐다가 다시 켜도록 코드를 수정하는 방법 올빼미. 시작 로트에서 다음 거래 세션을 시작했습니다.

설정(예: 0.01)에 지정되고 기록에서 마지막으로 닫힌 값의 곱에서 지정되지 않습니까?

 //+------------------------------------------------------------------+
#property copyright "Copyright © 2018, http://cmillion.ru "
#property link        "cmillion@narod.ru"
#property strict
#property description "Советник открывает позиции по индикатору RSI после SL увеличивает лот"
#property description "Следующая сделка не открывается, пока не закрыта предыдущая"
//-------------------------------------------------------------------
extern ENUM_TIMEFRAMES timeframe_RSI = 60 ;
extern int     period_RSI   = 14 ;
extern int     level_buy    = 30 ;
extern int     level_sell   = 70 ;

extern double Lot          = 0.1 ;
extern double K_Martin     = 2.0 ;

extern int     Stoploss     = 10 ,
              Takeprofit   = 50 ;
extern int     OrdersClose  = 5 ;

extern int     Magic        = 0 ;
extern int     DigitsLot    = 2 ;
extern int     slippage     = 3 ;
//-------------------------------------------------------------------
string AC;
datetime OpenTime;
double MINLOT,MAXLOT;
//-------------------------------------------------------------------
void OnTick ()
{
   if (!IsTradeAllowed()) 
   {
      DrawLABEL( "Торговля" , 0 , 0 , 0 ,Red, "Торговля запрещена" );
       return ;
   } 
   else DrawLABEL( "Торговля" , 0 , 0 , 0 ,Lime, "Торговля разрешена" );

   //---

   double STOPLEVEL=MarketInfo( Symbol (),MODE_STOPLEVEL);
   //---
   double OSL,OTP,OOP,SL,TP,Profit= 0 ;
   int b= 0 ,s= 0 ,tip;
   for ( int i= 0 ; i< OrdersTotal (); i++)
   {    
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderSymbol()== Symbol () && Magic==OrderMagicNumber())
         { 
            tip = OrderType(); 
            OSL = NormalizeDouble (OrderStopLoss(), Digits );
            OTP = NormalizeDouble (OrderTakeProfit(), Digits );
            OOP = NormalizeDouble (OrderOpenPrice(), Digits );
            SL=OSL;TP=OTP;
            Profit+=OrderProfit()+OrderCommission()+OrderSwap();
             if (tip==OP_BUY)             
            {  
               b++; 
               if (OSL== 0 && Stoploss!= 0 )
               {
                   if ((Bid- NormalizeDouble (OOP - Stoploss * Point , Digits )) / Point >=STOPLEVEL) SL = NormalizeDouble (OOP - Stoploss * Point , Digits );
               } 
               if (OTP== 0 && Takeprofit!= 0 )
               {
                   if (( NormalizeDouble (OOP + Takeprofit * Point , Digits )-Ask) / Point >=STOPLEVEL) TP = NormalizeDouble (OOP + Takeprofit * Point , Digits );
               } 
               if (SL != OSL || TP != OTP)
               {  
                   if (!OrderModify(OrderTicket(),OOP,SL,TP, 0 ,White)) Print ( "Error OrderModify " , GetLastError ());
               }
            }                                         
             if (tip==OP_SELL)        
            {
               s++;
               if (OSL== 0 && Stoploss!= 0 )
               {
                   if (( NormalizeDouble (OOP + Stoploss * Point , Digits )-Ask) / Point >=STOPLEVEL) SL = NormalizeDouble (OOP + Stoploss   * Point , Digits );
               }
               if (OTP== 0 && Takeprofit!= 0 )
               {
                   if ((Bid- NormalizeDouble (OOP - Takeprofit * Point , Digits )) / Point >=STOPLEVEL) TP = NormalizeDouble (OOP - Takeprofit * Point , Digits );
               }
               if (SL != OSL || TP != OTP)
               {  
                   if (!OrderModify(OrderTicket(),OOP,SL,TP, 0 ,White)) Print ( "Error OrderModify " , GetLastError ());
               }
            } 
         }
      }
   }
   
   
   //---
   
   double AB = AccountBalance();
   
   //---
   
   DrawLABEL( "Balance"         , 1 , 5 , 0 , clrGreen , StringConcatenate ( "Balance " ,DoubleToStr(AB, 2 ),AC));
   DrawLABEL( "Equity"          , 1 , 5 , 0 , clrGreen , StringConcatenate ( "Equity " ,DoubleToStr(AccountEquity(), 2 ),AC));
   DrawLABEL( "FreeMargin"      , 1 , 5 , 0 , clrGreen , StringConcatenate ( "FreeMargin " ,DoubleToStr(AccountFreeMargin(), 2 ),AC));
   DrawLABEL( "Take"            , 1 , 5 , 0 ,Color(Profit> 0 ,Lime,Red), StringConcatenate ( "Profit " ,DoubleToStr(Profit, 2 ),AC));
   
   double Lots= 0 ,RSI1= 0 ,RSI0= 0 ;
   if (b+s== 0 )
   {
      RSI0= iRSI ( NULL ,timeframe_RSI,period_RSI, PRICE_CLOSE , 0 );
      RSI1= iRSI ( NULL ,timeframe_RSI,period_RSI, PRICE_CLOSE , 1 );
   }
   else return ;

   //---
   if (RSI0>=level_buy && RSI1<=level_buy)
   {
      Lots=LOT();

       if (Lots>MAXLOT) Lots = MAXLOT;
       if (Lots<MINLOT) Lots = MINLOT;
      
       if (SendOrder(OP_BUY, Lots, NormalizeDouble (Ask, Digits )))OpenTime= iTime ( NULL ,timeframe_RSI, 1 ); 
   }

   //---
   
   if (RSI0<=level_sell && RSI1>=level_sell)
   {
      Lots=LOT();

       if (Lots>MAXLOT) Lots = MAXLOT;
       if (Lots<MINLOT) Lots = MINLOT;

       if (SendOrder(OP_SELL, Lots, NormalizeDouble (Bid, Digits ))) OpenTime= iTime ( NULL ,timeframe_RSI, 1 ); 
   }
}
//------------------------------------------------------------------
bool SendOrder( int tip, double lots, double price, double sl= 0 , double tp= 0 )
{
   if (tip< 2 )
   {
       if (AccountFreeMarginCheck( Symbol (),tip,lots)< 0 )
      {
         Alert ( "Недостаточно средств" );
         return ( 0 );
      }
   }
   for ( int i= 0 ; i< 10 ; i++)
   {    
       if ( OrderSend ( Symbol (),tip, lots,price,slippage,sl,tp, NULL ,Magic, 0 , clrNONE )!=- 1 ) return ( 1 );
         Alert ( " попытка " ,i, " Ошибка открытия ордера " ,Strtip(tip), " <<" ,( GetLastError ()), ">>  lot=" ,lots, "  pr=" ,price, " sl=" ,sl, " tp=" ,tp);
       Sleep ( 500 );
      RefreshRates();
       if ( IsStopped ()) return ( 0 );
   }
   return ( 0 );
}
//------------------------------------------------------------------
string Strtip( int tip)
{
   switch (tip) 
   { 
   case OP_BUY:
       return ( "BUY" ); 
   case OP_SELL:
       return ( "SELL" ); 
   case OP_BUYSTOP:
       return ( "BUYSTOP" ); 
   case OP_SELLSTOP:
       return ( "SELLSTOP" ); 
   case OP_BUYLIMIT:
       return ( "BUYLIMIT" ); 
   case OP_SELLLIMIT:
       return ( "SELLLIMIT" ); 
   }
   return ( "error" ); 
}
//------------------------------------------------------------------
void OnDeinit ( const int reason)
{
   if (!IsTesting()) 
   {
       ObjectsDeleteAll ( 0 );
   }
}
//-------------------------------------------------------------------
void DrawLABEL( string name, int CORNER, int X, int Y, color clr, string Name)
{
   if ( ObjectFind (name)==- 1 )
   {
       ObjectCreate (name, OBJ_LABEL , 0 , 0 , 0 );
      ObjectSet(name, OBJPROP_CORNER , CORNER);
      ObjectSet(name, OBJPROP_XDISTANCE , X);
      ObjectSet(name, OBJPROP_YDISTANCE , Y);
   }
   ObjectSetText(name,Name, 10 , "Arial" ,clr);
}
//+------------------------------------------------------------------+
int OnInit ()
{
   MINLOT = MarketInfo( Symbol (),MODE_MINLOT);
   MAXLOT = MarketInfo( Symbol (),MODE_MAXLOT);
   Comment ( "Start " ,TimeToStr( TimeCurrent (), TIME_DATE | TIME_SECONDS ));
   
   AC = StringConcatenate ( " " , AccountCurrency());
   
   int Y= 15 ;
   DrawLABEL( "Торговля"   , 1 , 5 ,Y,Red, "Торговля " );Y += 20 ;
   DrawLABEL( "Balance"    , 1 , 5 ,Y, clrGreen , StringConcatenate ( "Balance " ,DoubleToStr(AccountBalance(), 2 ),AC));Y += 15 ;
   DrawLABEL( "Equity"     , 1 , 5 ,Y, clrGreen , StringConcatenate ( "Equity " ,DoubleToStr(AccountEquity(), 2 ),AC));Y += 15 ;
   DrawLABEL( "FreeMargin" , 1 , 5 ,Y, clrGreen , StringConcatenate ( "FreeMargin " ,DoubleToStr(AccountFreeMargin(), 2 ),AC));Y += 30 ;

   DrawLABEL( "Take"            , 1 , 5 ,Y,Lime, "Profit " );Y += 20 ;
   
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
color Color( bool P, color a, color b)
{
   if (P) return (a);
   else return (b);
}
//------------------------------------------------------------------
double LOT()
{
   int n= 0 ;
   double OL=Lot;
   for ( int j = OrdersHistoryTotal()- 1 ; j >= 0 ; j--)
   {
       if ( OrderSelect (j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
         {
             if (OrderProfit()< 0 ) 
            {
               if (n== 0 ) OL= NormalizeDouble (OrderLots()*K_Martin,DigitsLot);
               n++;
               if (n>=OrdersClose) { Comment ( "1" ); return (Lot);}
            }
             else
            {
               if (n== 0 ) { Comment ( "2" ); return (Lot);}
               else { Comment ( "3" ); return (OL);}
            }
         }
      }
   }
   return (OL);
}
//------------------------------------------------------------------


Программные помощники MQL для работы на финансовых рынках
  • cmillion.ru
Скрипт показывает максимальную и минимальную корреляцию на выбранном отрезке истории, например за последние 10000 свечей. Таким образом можно заранее проанализировать какие пары и как коррелируют. В параметрах задаем Тф период корреляции и период анализа корреляции. Зеленым цветом выделяются пары с прямой корреляцией у которых корреляция выше...
 
законопослушный гражданин :

안녕하세요.

올빼미 테스트. (아래에 첨부된 코드).

올빼미. 이전 주문의 이력을 기반으로 마틴게일을 사용합니다(손실이 있는 경우 랏에 마틴 계수를 곱합니다..).

이전 주문은 예를 들어 (martin = 2..)에서 0.2로 많은 스톱으로 마감되었습니다. 그런 다음 MT4 터미널에서 "자동 거래"를 끄거나 터미널과 올빼미를 완전히 끕니다. 거래를 중지합니다.

또한 "자동 거래" 버튼이 켜지면 올빼미가 켜지고 다음 로트가 0.4의 볼륨으로 열립니다.

그래서 "자동 거래"를 끌 때 터미널 자체를 껐다가 다시 켜도록 코드를 수정하는 방법 올빼미. 시작 로트에서 다음 거래 세션을 시작했습니다.

설정(예: 0.01)에 지정되고 기록에서 마지막으로 닫힌 값의 곱에서 지정되지 않습니까?

전역 변수 생성

 datetime Start;

int OnInit ()
{
   Start= TimeCurrent ();
.....................
}
void OnTick ()
{
   if (!IsTradeAllowed()) 
   {
      DrawLABEL( "Торговля" , 0 , 0 , 0 ,Red, "Торговля запрещена" );
      Start= TimeCurrent ();
       return ;
   } 
.....................
}

그런 다음 나중에 개설/마감된 주문이 없으면 "시작"

Lots=Lot;
 
MakarFX :

전역 변수 생성

그런 다음 나중에 개설/마감된 주문이 없으면 "시작"

감사하다.

나는 아직 이것을 잘하지 못한다. 나는 이미 datetime OpenTime이 있습니다. - datetime Start 또는 추가로 대체해야 합니까?

"그리고 나중에 개설/마감 주문이 없으면 "시작" 랏=로트; " - 그것을 어디에 귀속시켜야 하는지가 전혀 분명하지 않습니까?

 
законопослушный гражданин :

감사하다.

나는 아직 이것을 잘하지 못한다. 나는 이미 datetime OpenTime이 있습니다. - datetime Start 또는 추가로 대체해야 합니까?

"그리고 나중에 개설/마감 주문이 없으면 "시작" 랏=로트; " - 어디에 무엇을 참조해야 하는지 명확하지 않습니까?

이 조언자에게 바라는 점(작업 논리)을 간단히 설명하십시오.

그렇지 않으면 코드에 추가 항목이 많이 있거나 이해하지 못하는 것 같습니다.

 
다른 표시기의 핸들(applyed_price)을 전달할 때 표시기를 추가하려면 이 다른 표시기에 버퍼가 하나만 있어야 합니까? 아니면 여러 개? 여러 개가 있는 경우 이 옵션을 사용하면 첫 번째 것은 두 번째 칠면조의 제로 버퍼에서만 데이터를 가져옵니다.
 

안녕하세요. 고문과 함께하십시오. 전략에 따르면 스톱이 트리거되면 어드바이저는 이를 다음 테이크에 추가해야 합니다(포인트 수).
아이디로 히스토리에서 가져오지만 어떤 이유로 추가되지 않습니다.

코드에서 옳지 않은 것은?

 if (isLimitOn && OrderSelect (OrderMagicNumber(), SELECT_BY_TICKET, MODE_HISTORY)){
            tpc += stop_loss;
             if ( OrderSelect (lastMagic, SELECT_BY_TICKET)){
               if (OrderType() == OP_BUY) {
                   double tp_price = NormalizeDouble ((OrderOpenPrice() + Point () * (tp + tpc)), Digits );
                   if (!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), tp_price, OrderExpiration()))
                     Print ( "Ошибка модификации ордера:" , GetLastError ());
               } else if (OrderType() == OP_SELL){
                   double tp_price = NormalizeDouble ((OrderOpenPrice() - Point () * (tp + tpc)), Digits );
                   if (!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), tp_price, OrderExpiration()))
                     Print ( "Ошибка модификации ордера:" , GetLastError ());
               }
            }
               
            isLimitOn = false ;
         }
 
SGarnov :

안녕하세요. 고문과 함께하십시오. 전략에 따르면 스톱이 트리거되면 어드바이저는 이를 다음 테이크에 추가해야 합니다(포인트 수).
아이디로 히스토리에서 가져오지만 어떤 이유로 추가되지 않습니다.

코드에서 옳지 않은 것은?

"OrderMagicNumber()"가 무엇이며 "stop_loss"가 무엇인지 명확하지 않습니다.
 
확인?
 
안녕하세요, 조언자가 필요합니다. 어디에서 인증을 받을 수 있나요?