voidOnTick() { //--- 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); } } //--- вызов функции открытия позиции на продажу } } }
你好,我没有找到一个关于为Android 2.3升级 Metatrader 4终端 的主题,所以请不要因为我在这个主题中发帖而对我大加责备。市场上的终端只适用于安卓4+系统。我在哪里可以得到一个更新,因为我的停止工作了。
关于交易、自动交易系统和交易策略测试的论坛
终端mt5和mt4不工作
Renat Fatkhullin, 2016.11.13 23:51
对不起,我们不再支持4.0.3以下的Android版本我在那里没有什么可解释的,所以没有人回答。你所展示的图表是没有意义的,它是如何获得的,是一个谜。
当需要优化一个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) 。
谢谢你!
你好!
我正在努力学习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);
}
//+------------------------------------------------------------------+
{
//---
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);
}
}
//--- вызов функции открытия позиции на продажу
}
}
}
以下是为任何类型的订单计算正确止损单的函数。
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,我会研究的。
不客气。只要你需要获得准确的止损价格,知道市场或挂单 的开盘价,就可以用这些函数获得所需的价格--它们将返回所需止损订单的已计算价格。
假设你有一个挂单的设定价格:
double priseSet=1.12345;
那么BuyLimit的止损价格
int StopLoss=20; 点将是:
double sl=CorrectStopLoss(Symbol(),OP_BUYLIMIT,priceSet,StopLoss);
sl变量将采取正确计算的BuyLimit的止损与StopLevel需求。
这里有一个提示。假设有一个空头头寸被打开。当买入信号出现时,要关闭空头,打开多头。
检查是否有一个开放的 卖出头寸。如果是,请关闭它。
然后建立一个买入头寸。
这是最基本的。
我很想用mql4来实现这样的算法。
有两个来自不同经纪公司的MT4终端。其中一个有一个 "独占 "指标,它不能被移到另一个终端(如市场)。
那又怎样!?是否有可能将 "独家 "指标的缓冲区读数,在自己的终端中实现自己的指标?
某种程度上,资源并没有发挥作用。