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

 
안녕하세요! Android 2.3용 Metatrader 4 터미널 업데이트에 대한 주제를 찾지 못했습니다. 이 주제를 다루기 위해 너무 세게 몰아붙이지 마십시오. 시장에서 단말기는 Android 4+ 전용입니다. 어디에서 업데이트할 수 있습니까? 그렇지 않으면 광산이 작동을 멈춥니다.
 
k19alex69 :
안녕하세요! Android 2.3용 Metatrader 4 터미널 업데이트에 대한 주제를 찾지 못했습니다. 이 주제를 다루기 위해 너무 세게 몰아붙이지 마십시오. 시장에서 단말기는 Android 4+ 전용입니다. 어디에서 업데이트할 수 있습니까? 그렇지 않으면 광산이 작동을 멈춥니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

mt5 및 mt4 터미널이 작동하지 않음

레나트 팻쿨린 , 2016.11.13 23:51

불행히도 4.0.3 미만의 Android 버전은 더 이상 지원하지 않습니다.

 
Sergey Basov :

특별히 설명할 것이 없으니 아무도 대답하지 않는다. 당신이 보여준 그 그래프는 무의미하고 어떻게 얻었는지 수수께끼입니다.

그리고 테스터의 "최적화 그래프" 탭에 있는 "2차원 표면" 옵션은 조언자의 2개 입력 매개변수를 최적화해야 하거나 기록에서 2개 매개변수의 값을 시각적으로 확인해야 할 때 의미가 있습니다(IMHO). 이러한 매개변수가 상호 의존적인지, 그리고 그들이 전혀 의미가 있는지 여부와 같은 좋은 결과가 있었습니다.

어떤 이유로 두 축의 차트에는 0만 있고 수직으로 이 0은 3개의 중간 단계로 더 나뉩니다. 정사각형". 결과는 무작위로 보입니다. 흰색과 녹색 "주사위"가 무작위로 흩어져 있습니다. 따라서 그래프는 무의미하고 아무 의미가 없어 보입니다.

그래프가 무의미할 수 있지만 2014년부터 2015년까지 사이트에서 최적화한 후 최상의 매개변수를 선택하여 설정하고 2014년부터 현재까지 재테스트를 하면 손실/손실의 결과는 그대로 유지되지만 이익은 비례하여 증가합니다. 기간. 또한 봇은 한 달 동안 데모 작업을 했으며 지난 달에 기본 매개 변수로 테스트할 때 모든 트랜잭션이 테스터 = + -5pp와 일치합니다. 나는 큐브와 그들의 색깔을 뛰어 넘었다는 것을 의미하지 않습니다.

설명해주셔서 감사합니다.

 
안녕하세요!
저는 MQL4를 공부하고 있으므로 질문에 대해 세게 걷어차지 마시기 바랍니다.
현재 가격이 아니라 계산 중에 얻은 가격에서 배치되는 경우 보류 중인 주문 에 대한 SL 및 TP를 올바르게 계산하는 방법을 알려주십시오.
양초의 길이를 기준으로 계산해야 합니다. 다음과 같이 다소:
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*포인트,자리수);
고맙습니다!
 
Viachaslau Baiko :
안녕하세요!
저는 MQL4를 공부하고 있으므로 질문에 대해 세게 걷어차지 마시기 바랍니다.
현재 가격이 아니라 계산 중에 얻은 가격에서 배치되는 경우 보류 중인 주문 에 대한 SL 및 TP를 올바르게 계산하는 방법을 알려주십시오.
양초의 길이를 기준으로 계산해야 합니다. 다음과 같이 다소:
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*포인트,자리수);
고맙습니다!

다음은 모든 종류의 주문에 대해 올바른 중지 주문을 계산하는 기능입니다.

//+------------------------------------------------------------------+
double CorrectStopLoss( string symbol_name, int op, double price_set, double stop_loss) {
   if (stop_loss== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op== OP_BUY )? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op== OP_SELL )? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op== OP_BUY || op== OP_BUYLIMIT || op== OP_BUYSTOP ) return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,stop_loss),dg));
   else return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss( string symbol_name, int op, double price_set, int stop_loss) {
   if (stop_loss== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op== OP_BUY )? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op== OP_SELL )? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op== OP_BUY || op== OP_BUYLIMIT || op== OP_BUYSTOP ) return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,price-stop_loss*pt),dg));
   else return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit( string symbol_name, int op, double price_set, double take_profit) {
   if (take_profit== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op== OP_BUY )? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op== OP_SELL )? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op== OP_BUY || op== OP_BUYLIMIT || op== OP_BUYSTOP ) return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,take_profit),dg));
   else return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit( string symbol_name, int op, double price_set, int take_profit) {
   if (take_profit== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op== OP_BUY )? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op== OP_SELL )? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op== OP_BUY || op== OP_BUYLIMIT || op== OP_BUYSTOP ) return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,price+take_profit*pt),dg));
   else return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel( string symbol_name) {
   int sp=( int ) SymbolInfoInteger (symbol_name, SYMBOL_SPREAD );
   int lv=( int ) SymbolInfoInteger (symbol_name, SYMBOL_TRADE_STOPS_LEVEL );
   return ((lv== 0 )?sp* 2 :lv);
   }
//+------------------------------------------------------------------+
 
void OnTick ()
  {
//---
   MqlDateTime server_time;
   TimeToStruct ( TimeCurrent (),server_time);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if (server_time.min%minutesBefore== 0 || server_time.min== 0 ) {
       if (SignalByRSI( Symbol (),TimeframeRSI,minutesBefore)== OP_BUY ) {
         //--- получили сигнал на покупку
         Print ( "Сигнал на покупку " , TimeCurrent ());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на покупку
         if ( OrdersTotal () == 0 )  
         {
         ticket= OrderSend ( Symbol (), OP_BUY , Lts, Ask , 0 , 0 , 0 , NULL , 1234 , 0 , Blue);  
         Alert ( "Есть сигнал на покупку  " , sim, per);
         }
         if ( OrdersTotal () > 0 )  
    
     if ( OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES ))
     if ( OrderType ()== OP_SELL )
     {
     OrderClose (ticket, OrderLots (), Bid , 0 ,Blue);
     {
     ticket= OrderSend ( Symbol (), OP_BUY , Lts, Ask , 0 , 0 , 0 , NULL , 1234 , 0 , Blue);
     Alert ( "Есть сигнал на закрытие продажи и открытие покупки  " , sim, per);
     }
     }
    
    
         //--- вызов функции открытия позиции на покупку
         }
       if (SignalByRSI( Symbol (),TimeframeRSI,minutesBefore)== OP_SELL ) {
         //--- получили сигнал на продажу
         Print ( "Сигнал на продажу " , TimeCurrent ());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на продажу
         if ( OrdersTotal () == 0 )  
         {
         ticket= OrderSend ( Symbol (), OP_SELL , Lts, Bid , 0 , 0 , 0 , NULL , 1234 , 0 , Red);
         Alert ( "Есть сигнал на продажу  " , sim, per);
         }
         if ( OrdersTotal () > 0 )  
    
     if ( OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES ))
     if ( OrderType ()== OP_BUY )
     {
     OrderClose (ticket, OrderLots (), Ask , 0 ,Red);
     {
     ticket= OrderSend ( Symbol (), OP_SELL , Lts, Bid , 0 , 0 , 0 , NULL , 1234 , 0 , Red);
     Alert ( "Есть сигнал на закрытие покупки и открытие продажи  " , sim, per);
     }
     }
         //--- вызов функции открытия позиции на продажу
         }
      }
  }
말하다. 쇼트가 열려 있다고 가정 해 봅시다. 매수 신호가 나타나면 매도하고 매수합니다.
 
Artyom Trishkin :

다음은 모든 종류의 주문에 대해 올바른 중지 주문을 계산하는 기능입니다.

//+------------------------------------------------------------------+
double CorrectStopLoss( string symbol_name, int op, double price_set, double stop_loss) {
   if (stop_loss== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op== OP_BUY )? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op== OP_SELL )? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op== OP_BUY || op== OP_BUYLIMIT || op== OP_BUYSTOP ) return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,stop_loss),dg));
   else return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss( string symbol_name, int op, double price_set, int stop_loss) {
   if (stop_loss== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op== OP_BUY )? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op== OP_SELL )? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op== OP_BUY || op== OP_BUYLIMIT || op== OP_BUYSTOP ) return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,price-stop_loss*pt),dg));
   else return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit( string symbol_name, int op, double price_set, double take_profit) {
   if (take_profit== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op== OP_BUY )? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op== OP_SELL )? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op== OP_BUY || op== OP_BUYLIMIT || op== OP_BUYSTOP ) return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,take_profit),dg));
   else return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit( string symbol_name, int op, double price_set, int take_profit) {
   if (take_profit== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op== OP_BUY )? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op== OP_SELL )? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op== OP_BUY || op== OP_BUYLIMIT || op== OP_BUYSTOP ) return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,price+take_profit*pt),dg));
   else return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel( string symbol_name) {
   int sp=( int ) SymbolInfoInteger (symbol_name, SYMBOL_SPREAD );
   int lv=( int ) SymbolInfoInteger (symbol_name, SYMBOL_TRADE_STOPS_LEVEL );
   return ((lv== 0 )?sp* 2 :lv);
   }
//+------------------------------------------------------------------+
Artem 감사합니다! 나는 이것을 정리할 것이다.
 
Viachaslau Baiko :
Artem 감사합니다! 나는 이것을 정리할 것이다.

별말씀을요. 스탑 주문의 정확한 가격을 알아야 하는 경우, 시장의 시작 가격을 알고 있거나 보류 중인 주문 을 하는 경우 이러한 기능을 사용하여 필요한 가격을 얻을 수 있습니다. 원하는 스탑 주문에 대해 이미 계산된 가격을 반환합니다.

보류 중인 주문 설정 가격이 있다고 가정해 보겠습니다.
이중 상품 세트=1.12345;
그럼 손절매 가격
정수 손절매 = 20; BuyLimit에 대한 포인트는 다음과 같습니다.
더블 sl=CorrectStopLoss(Symbol(),OP_BUYLIMIT,priceSet,StopLoss);

sl 변수는 StopLevel 요구 사항을 고려하여 BuyLimit에 대해 올바르게 계산된 손절매 값을 사용합니다.

 
strongflex :
말하다. 쇼트가 열려 있다고 가정 해 봅시다. 매수 신호가 나타나면 매도하고 매수합니다.

오픈 매도 포지션 이 있는지 확인하십시오. 있으면 닫습니다.

그런 다음 매수 포지션을 엽니다.

초등이다

 

mql4를 사용하여 그러한 알고리즘을 구현하고자 하는 열망이 있습니다.

다른 브로커의 2개의 MT4 터미널이 있습니다. 하나는 (시장에서와 같이) 어떤 식으로든 다른 터미널로 끌 수 없는 "독점적인" 표시기를 가지고 있습니다.

여기 있습니다! 어떻게든 "독점적인" 표시기의 버퍼에서 판독값을 가져와 터미널의 표시기에 구현할 수 있습니까?

리소스는 어떻게 든 실패합니다.

사유: