新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 7

 
你好!我找不到一个关于为Android 2.3升级 Metatrader 4终端 的主题,所以请不要因为我在这个主题里发帖而踢我太多。在市场上,该终端只适用于Android 4+。我在哪里可以得到一个更新,因为我的停止工作了。
 
k19alex69:
你好,我没有找到一个关于为Android 2.3升级 Metatrader 4终端 的主题,所以请不要因为我在这个主题中发帖而对我大加责备。市场上的终端只适用于安卓4+系统。我在哪里可以得到一个更新,因为我的停止工作了。

关于交易、自动交易系统和交易策略测试的论坛

终端mt5和mt4不工作

Renat Fatkhullin, 2016.11.13 23:51

对不起,我们不再支持4.0.3以下的Android版本

 
Sergey Basov:

我在那里没有什么可解释的,所以没有人回答。你所展示的图表是没有意义的,它是如何获得的,是一个谜。

当需要优化一个EA的2个输入参数时,或者要直观地看到历史上2个参数在什么数值下有好的结果,这些参数是否相互依赖,以及它们是否有意义时,测试仪 "优化图 "标签中的 "二维表面 "选项才有意义(我认为)。

由于某种原因,你在两个轴上都只有0,而且在垂直方向上,这些0被分为3个中间步骤,所以你有 "方块一在中心,二在较低/较高,二/三在一个方块"。 而且结果看起来是随机的--白色和绿色的 "方块 "是随机散布的。所以这张图毫无意义,似乎没有任何意义。

这张图可能没有意义,但经过2014-2015年期间的优化,当选择和设置更好的参数,并从2014年到今天重新测试,损失/缩减的结果保持不变,好吧,利润的增加与期间的比例。另外,机器人在一个演示中工作了一个月,在最后一个月的测试中,在默认参数下,所有的交易都与测试者相吻合=+5pp。所以,我不打算玩立方体和它们的颜色。

谢谢你的澄清。

 
你好!
我正在努力学习MQL4,因此请不要对我的问题感到抱歉。
请告知如何正确计算挂单 的SL和TP,如果它不是按当前价格而是按计算过程中获得的价格下单?
它们应该根据蜡烛图的长度来计算。它大约是这样的。
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits) 。
谢谢你!
 
Viachaslau Baiko:
你好!
我正在努力学习MQL4,所以请不要对我的问题感到抱歉。
请告知如何正确计算挂单 的SL和TP,如果不是按当前价格而是按计算过程中得到的价格下单。
它们应该根据蜡烛图的长度来计算。它大约是这样的。
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits) 。
谢谢你!

以下是为任何类型的订单计算正确止损单的函数。

//+------------------------------------------------------------------+
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,我会研究的。

不客气。只要你需要获得准确的止损价格,知道市场或挂单 的开盘价,就可以用这些函数获得所需的价格--它们将返回所需止损订单的已计算价格。

假设你有一个挂单的设定价格:
double priseSet=1.12345;
那么BuyLimit的止损价格
int StopLoss=20; 点将是:
double sl=CorrectStopLoss(Symbol(),OP_BUYLIMIT,priceSet,StopLoss);

sl变量将采取正确计算的BuyLimit的止损与StopLevel需求。

 
strongflex:
这里有一个提示。假设有一个空头头寸被打开。当买入信号出现时,要关闭空头,打开多头。

检查是否有一个开放的 卖出头寸。如果是,请关闭它。

然后建立一个买入头寸。

这是最基本的。

 

我很想用mql4来实现这样的算法。

有两个来自不同经纪公司的MT4终端。其中一个有一个 "独占 "指标,它不能被移到另一个终端(如市场)。

那又怎样!?是否有可能将 "独家 "指标的缓冲区读数,在自己的终端中实现自己的指标?

某种程度上,资源并没有发挥作用。

原因: