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

 
Ihor Herasko :

이 스왑 계산 방법을 롤오버라고 합니다. MT4에서는 프로그래밍 방식으로 이에 대해 학습하는 것이 불가능합니다. 작동 시장 주문과 함께 자정 전환이 발생한 후에 간접적으로만. MT4에는 이러한 작지만 다소 불쾌한 문제가 많이 있습니다. MT5에서는 조금 줄어들었지만 여전히 사용 가능합니다.

이것은 포인트의 스왑 값입니다. 시장 주문량에 따라 예금 통화 로 변환해야 합니다. 그러면 스왑의 실제 크기가 얻어집니다.

" MT4에서는 프로그래밍 방식으로 학습하는 것이 불가능합니다." 시간을 내어 답변해 주셔서 감사합니다.

 

안녕하세요! 포럼 사용자 여러분, 알고리즘을 이해하는 데 도움을 주시기 바랍니다. 작업은 지정된 기간 내에서 가격 범위를 결정하고 최대 및 최소에서 매수 정지 및 매도 정지를 설정하는 것입니다. 손절매는 반대 주문으로 설정됩니다. 이익실현은 손절매*2와 같아야 합니다.

또한, 손절매로 마감한 후 주문 은 동일한 손절매와 이익실현으로 복원되며, 주문 중 하나가 이익실현으로 마감된 후 전체 사이클이 종료됩니다. 그리고 처음부터 범위를 결정하고 가자.

그러나 이제 그는 TP를 더 정확하게 넣지 않았지만 시작 가격과 손절매는 범위의 크기와 다릅니다. 반대 방향의 순서가 아닙니다. 당신의 도움에 미리 감사드립니다.

 static int prevtime = 0 ;
int MagicNumber = 12345678 ;
input int stoploss = 40 ;
input int takeprofit = 50 ;
input int padding = 5 ;
int a= 1 ;
input string startTime = "14:35" ;
input string endTime = "18:35" ;
int expertBars;
double max, min;
bool isEndTime = true ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   //sendOrders();
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
#include <expert.mq4>
 
int start()
{  
     //Возвращает максимум и минимум за промежуток
     if (isTime()) getMaxMin();
    
     // всё, что задается ниже - будет работать по "ценам открытия"
     //нового бара, т.е. будет срабатывать в момент его появления
     //на том графике, на кот. стоит советник
    CheckEvents( MagicNumber );
     if ( eventBuyClosed_SL > 0 ) {
         Alert ( _Symbol , OrderClosePrice (), ": Buy-позиция закрыта по СтопЛоссу!" );
         double minstoplevel= MarketInfo ( Symbol (), MODE_STOPLEVEL );
         Alert ( "Минимальный стоп левел: " , minstoplevel);
         OrderSend ( _Symbol , OP_BUYSTOP , OrderLots (), OrderOpenPrice (), 3 , OrderStopLoss (), OrderTakeProfit (), "My order" ,MagicNumber, 0 , clrGreen );
    }
    
     if ( eventBuyClosed_TP > 0 ) {
         Alert ( _Symbol , OrderClosePrice (), ": Buy-позиция закрыта по ТейкПрофиту!" );
        deleteAllPaddingOrders();
    }
    
     if ( eventSellClosed_SL > 0 ) {
         Alert ( _Symbol , OrderClosePrice (), ": Sell-позиция закрыта по СтопЛоссу!" );
         double minstoplevel= MarketInfo ( Symbol (), MODE_STOPLEVEL );
         Alert ( "Минимальный стоп левел: " , minstoplevel);
         OrderSend ( _Symbol , OP_SELLSTOP , OrderLots (), OrderOpenPrice (), 3 , OrderStopLoss (), OrderTakeProfit (), "My order" ,MagicNumber, 0 , clrRed );
    }
    
     if ( eventSellClosed_TP > 0 ) {
         Alert ( _Symbol , OrderClosePrice (), ": Sell-позиция закрыта по ТейкПрофиту!" );
        deleteAllPaddingOrders();
    }
    
     if ( eventBuyLimitOpened > 0 || eventBuyStopOpened > 0 || 
          eventSellLimitOpened > 0 || eventSellStopOpened > 0 )
         Alert ( _Symbol , OrderType (), ": сработал отложенный ордер!" );
return ( 0 );
}
//-----------------------------------------------------------------+
void deleteAllPaddingOrders() {
   int total = OrdersTotal ();
   for ( int i=total- 1 ;i>= 0 ;i--)
  {
     OrderSelect (i, SELECT_BY_POS );
     int type   = OrderType ();
     if ( OrderMagicNumber () != MagicNumber) continue ;
     if ( OrderSymbol () != _Symbol ) continue ;
     bool result = false ;
    
     switch (type)
    {
       //Close opened long positions
       case OP_BUY        : result = OrderClose ( OrderTicket (), OrderLots (), MarketInfo ( OrderSymbol (), MODE_BID ), 5 , Red );
                           break ;
      
       //Close opened short positions
       case OP_SELL       : result = OrderClose ( OrderTicket (), OrderLots (), MarketInfo ( OrderSymbol (), MODE_ASK ), 5 , Red );
       //                    break;

       //Close pending orders
       //case OP_BUYLIMIT  :
       //case OP_SELLLIMIT :
       case OP_BUYSTOP    :
       case OP_SELLSTOP   : result = OrderDelete ( OrderTicket () );
    }
    
     if (result == false )
    {
       Alert ( "Order " , OrderTicket () , " failed to close. Error:" , GetLastError () );
       Sleep ( 3000 );
    }
     return ;
  }
  
   return ;
}
void sendOrders( bool isFirst) {
   //--- получим минимальное значение Stop level
   double minstoplevel= MarketInfo ( Symbol (), MODE_STOPLEVEL );
   Print ( "Minimum Stop Level=" ,minstoplevel, " points" );
   //--- BUYSTOP
   //--- вычисленные значения цен SL и TP должны быть нормализованы
   //--- размещаем рыночный ордер на покупку 1 лота
   int ticketBuyStop, ticketSellStop;
   if (!isFirst) {
      ticketBuyStop= OrderSend ( Symbol (), OP_BUYSTOP , 1 , Ask + padding * Point , 20 , Bid -padding* Point , Ask + padding * Point , "My order" ,MagicNumber, 0 , clrGreen );
      ticketSellStop= OrderSend ( Symbol (), OP_SELLSTOP , 1 , Bid - padding * Point , 20 , Ask + padding* Point , Bid - padding * Point , "My order" ,MagicNumber, 0 , clrRed );
   } else { 
      ticketBuyStop= OrderSend ( Symbol (), OP_BUYSTOP , 1 ,max + padding * Point , 20 ,min -padding* Point ,max + (max - min + padding) * Point , "My order" ,MagicNumber, 0 , clrGreen );
      ticketSellStop= OrderSend ( Symbol (), OP_SELLSTOP , 1 ,min - padding * Point , 20 ,max + padding* Point ,min - (max - min  + padding)* Point , "My order" ,MagicNumber, 0 , clrRed );
   }
   if (ticketBuyStop< 0 )
     {
     Print ( "OrderSend завершилась с ошибкой #" , GetLastError ());
      
         deleteAllPaddingOrders();
         if (a <= 5 ) {
         //sendOrders(isFirst);
         a= a+ 1 ;
      }
     }
   else
       Print ( "Функция OrderSend успешно выполнена" );
   //---BUYSTOP
   
   //---SELLSTOP
   //--- вычисленные значения цен SL и TP должны быть нормализованы
   //--- размещаем рыночный ордер на покупку 1 лота
   
   if (ticketSellStop< 0 )
     {
      
         deleteAllPaddingOrders();
         if (a <= 5 ) {
             //sendOrders();
            a= a+ 1 ;
             Print ( "a" , a);
         }
         Print ( "OrderSend завершилась с ошибкой #" , GetLastError ());
       
     }
   else
       Print ( "Функция OrderSend успешно выполнена" );
   //---SELLSTOP
   return ;
}
bool getMaxMin() {
   int startIndex = iBarShift ( _Symbol , 0 , StrToTime (startTime), true );
   min= iLow ( NULL , 0 , iLowest ( NULL , 0 , MODE_LOW ,startIndex, 0 ));
   max= iHigh ( NULL , 0 , iHighest ( NULL , 0 , MODE_HIGH ,startIndex, 0 ));
   Alert ( "Min: " , min);
   Alert ( "Max: " , max);
   sendOrders( true );
   return true ;
}

//===============================================================================+
//======| возвращает true если временной диапозон кончился                       |
//===============================================================================+
bool isTime() {
   if ( TimeHour ( StrToTime (startTime)) == Hour () && TimeMinute ( StrToTime (startTime)) == Minute () && isEndTime) { Alert ( "Start Timeline" ); isEndTime = false ; deleteAllPaddingOrders();};
   if ( TimeHour ( StrToTime (endTime)) == Hour () && TimeMinute ( StrToTime (endTime)) <= Minute () && !isEndTime) { Alert ( "End Timeline" ); isEndTime = true ; return true ;};
   return false ;
}

//=====================================================================+
//======| возвращает true если появился новый бар, иначе false |
//=====================================================================+
//bool isNewBar()
//{
//bool res=false;
//if(expertBars!=iBars(Symbol(),0))
//{
//expertBars=iBars( Symbol (),0);
//res=true;
//}
//return(res);
//}
 
Sobbaka :

다른 스레드 에서 질문을 복제할 필요가 없습니다.

 

안녕하세요!

로그에서 테스트할 때 OrderSend 오류 130 오류가 생성됩니다. 올바르게 이해하면 정류장 또는 소요 시간에만 연결할 수 있습니다. 무엇이 잘못되었는지 확인하세요.

 #define MagicNumber1 100              //Buy
input double MaximumRisk= 0.03 ;       //Max риск в сделке
input double K=1;                   //Коэффициент риск к прибыли
input int OrderPoint= 30 ;             //Расстояние до отложенного ордера
double Price= 0 ;                     //Цена для установки отложенного ордера
double SL= 0 ;                         //Stop Loss
double TP= 0 ;                         //Take Profit
double Lots= 0 ;                       //Просчет лотности исходя из max риска одной сделки


void OnTick ()
{
//Параметры для открытия ордера                   
Price = NormalizeDouble ( High [ 1 ]+OrderPoint* Point , Digits ); //Цена открытия ордера
SL = NormalizeDouble ( Low [ 1 ]- Point , Digits ); //Стоп лосс
if ((Price-SL)< NormalizeDouble ( MarketInfo ( Symbol (), MODE_STOPLEVEL )* Point , Digits ))
{SL=Price- NormalizeDouble ( MarketInfo ( Symbol (), MODE_STOPLEVEL )* Point , Digits );}
TP = NormalizeDouble ((Price-SL)*K+Price, Digits ); //Тэйк профит
//Просчет лотности исходя из риска в сделке
Lots = NormalizeDouble ((( AccountBalance ()*MaximumRisk/ 100.0 )/((Price-SL)* 1000.0 )), 1 );

//Установка отложенного ордера
bool send1= OrderSend ( Symbol (), OP_BUYSTOP ,Lots,Price, 3 ,SL,TP, "comment" ,MagicNumber1, 0 , clrGreen );
}
 
YanSay :

안녕하세요!

로그에서 테스트할 때 오류 OrderSend 오류 130이 생성됩니다. 올바르게 이해하면 중지 또는 소요에만 연결할 수 있습니다.

보류 중인 주문 의 시작 가격도 영향을 받습니다. 따라서 현재 시장 가격과 주문 시가 사이의 거리도 확인해야 합니다. 이 경우: 가격 - 묻습니다.

 
Ihor Herasko :

보류 중인 주문 의 시작 가격도 영향을 받습니다. 따라서 현재 시장 가격과 주문 시가 사이의 거리도 확인해야 합니다. 이 경우: 가격 - 묻습니다.

덕분에!
 
Artyom Trishkin :
Hour() 함수는 무엇을 반환합니까?

현재 시간을 반환합니다. 나는 일한다: 현재 시간이 11시보다 크고 17시보다 작으면,

 if ( Hour ()>= 17 && Hour ()<= 11 ) continue ;

그래서 어떻게 되어야 합니까?

 
Tigerfreerun :

나에게는 어렵다. 추가할 코드 부분과 mn 및 mag_n이 무엇을 의미하는지 설명해 주시겠습니까? 여기에서 마법 고문을 입력할 수 있습니까?

당신의 조건을 두기 전에

 if ( Hour ()>= 0 && Hour ()<= 8 &&!OP_TO(mag_n))step = 5 ; else step = 10 ;

mag_n - 여기에 고문의 탄창을 입력합니다.

 
PolarSeaman :

현재 시간을 반환합니다. 나는 씁니다: 현재 시간이 11시보다 크고 17시보다 작으면 어떻게 되어야 합니까?

내가 이해하는 한 질문은 지표에 관한 것입니다. Hour() -> time[i] 대신

 
Vitaly Muzichenko :

내가 이해하는 한 질문은 지표에 관한 것입니다. Hour() -> time[i] 대신

예, 도움이 되었습니다. 이제 시간을 제한하고 싶습니다. 17:00부터 11:00까지는 계산을 제외합니다.

   for ( int i=limit- 2 ; i> 0 ; i--) 
     {
     if ( Hour ()>= 17 && Hour ()<= 11 ) continue ;
       if (i% 2 == 0 ) 
        {
         if (open[i]<close[i] && open[i+ 1 ]>close[i+ 1 ]) 
           {
            k1++;
           // if(k1>max) {max=k1; dat_max=time[i];}
             if (k1>= 4 ) Print ( "Num: " ,k1, "dat_max " ,time[i]);
            SetText( "Obj_" +( string )time[i],( string )k1,time[i],high[i],Arr);
           }
         else k1= 0 ;
         
           } else {
         if (open[i]<close[i] && open[i+ 1 ]>close[i+ 1 ]) 
           {
            k2++;
             //if(k2>max){ max=k2; dat_max=time[i];}
             if (k2>= 4 ) Print ( "Num: " ,k2, "dat_max " ,time[i]);
            SetText( "Obj_" +( string )time[i],( string )k2,time[i],high[i],Arr);
           }
         else k2= 0 ;
         
        }
      
     }
사유: