初学者的问题 MQL4 MT4 MetaTrader 4 - 页 255

 
Mihail Matkovskij #:

你是如何计算tp的?

我在变量double tp=50中指定。

 
Roman Epifanov #:

我在变量double tp=50中指定。

double takeProfit;
takeProfit = NormalizeDouble(Bid - tp * Point(), Digits()); // TP для Sell
 
Mihail Matkovskij #:

现在写的是

2021.12.04 13:56:09.509 TestGenerator: 不匹配的数据错误(2021.12.03 23:45的高价1.13110没有从最低时间段达到,高价1.13104不匹配。)


//+------------------------------------------------------------------+
//|                                                         repa.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int i;
   double lot_sum;
   bool trend;
   double ema;
   double sl=50.0,tp=50.0;
   tp = NormalizeDouble(Bid - tp * Point(), Digits()); // TP для Sell
   double lot=0.01;
   while (i<OrdersTotal())
   {
   OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
   lot_sum=lot_sum + OrderLots(); // сумма лотов открытых позиций
   
   
   }
   
   ema=iMA(NULL,0,50,0,MODE_EMA,PRICE_CLOSE,0); //взяли значение средней
   if (Close[0]<ema)trend=true ;else if(Close[0]>ema)trend=false; //определили тренд
   
   if (Close[1]<Open[1]) {OrderSend(Symbol(),OP_SELL,lot,Bid,2,Ask+sl,tp,"Candle sell, Close[0]<MA");};
   
   
  }
//+------------------------------------------------------------------+
 
Mihail Matkovskij #:

戴上它一分钟......就可以了......。

但停止水平是不同的 -

1 2021.09.16 05:59 出售 1 0.01 1.18190 51.18192 1.18140 0.00 10000.00


 
Roman Epifanov #:

现在写的是

2021.12.04 13:56:09.509 TestGenerator: 不匹配的数据错误(2021.12.03 23:45的高价1.13110没有从最低时间段达到,高价1.13104不匹配。)


void OnTick()
  {
//---
   int i;
   double lot_sum;
   bool trend;
   double ema;
   double sl=50.0,tp=50.0;
   double stopLoss, takeProfit, openPrice;
   double lot=0.01;
   while (i<OrdersTotal())
   {
     OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
     lot_sum=lot_sum + OrderLots(); // сумма лотов открытых позиций
   
   }
   
   ema=iMA(NULL,0,50,0,MODE_EMA,PRICE_CLOSE,0); //взяли значение средней

   if (Close[0]<ema)
     trend=true ;
   else if(Close[0]>ema)
     trend=false; //определили тренд
    
   takeProfit = NormalizeDouble(Bid - tp * Point(), Digits()); // TP для Sell
   stopLoss = NormalizeDouble(Bid + sl * Point(), Digits()); // SL для Sell
   openPrice = NormalizeDouble(Bid, Digits());

   if (Close[1]<Open[1]) {
     OrderSend(Symbol(), OP_SELL, lot, openPrice, 2, stopLoss, takeProfit, "Candle sell, Close[0]<MA");
   }
   
  }

所有规则都在网上,请自行查阅。

 
Mihail Matkovskij #:

规则都在网上,请自己查看。

谢谢你!

 

晚上好,先生们,请告知为什么顾问在打开第二个订单时出现错误?


顾问的文本本身



//+----------------------Параметры-----------------------------------+

输入 int TakeProfit = 100; // 以点为单位的利润

输入 int StopLoss = 50; // 以点为单位的损失

输入双倍的Lot = 0.01; // 开始手数

输入双倍Multilot = 1.95; // 起始手数的倍数

输入 int Slippage =30; // Slippage

输入 int MagicNumber = 333 ; // 唯一的数字


//+------------------------------------------------------------------+

//|专家初始化功能|

//+------------------------------------------------------------------+

double tp=0。

double sl=0。

int OnInit()

{

tp=NormalizeDouble(TakeProfit*Point(),Digits())。

sl=NormalizeDouble(StopLoss*Point(),Digits())。

return(INIT_SUCCEED)。

}


//+------------------------------------------------------------------+

//|专家打勾功能|

//+------------------------------------------------------------------+

空白的OnTick()

{

//--当专家顾问被激活时,循环检查未结订单并计算它们。

int buy=0; //买入订单的数量

int sell=0; //卖出订单的数量


for(int i = OrdersTotal()-1; i>=0; i--)

如果(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))

如果(OrderSymbol()==Symbol())

如果(OrderMagicNumber()== MagicNumber)

{

如果(OrderType()==OP_BUY)

买++。

如果(OrderType()==OP_SELL)

出售++。

}


//--当EA被激活时,循环获得最后一个关闭订单的数据

int type=-1; //一个封闭订单的类型

int history_close_orders=0; //已关闭订单的数量

double lot=0; //Lot of the last closed order

double profit=0; //最后一笔订单平仓时的利润。

datetime time=0; //最后一个订单的结束时间。


for(int i = OrdersHistoryTotal()-1; i>=0; i--)

if(OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))

如果(OrderSymbol()==Symbol())

如果(OrderMagicNumber()== MagicNumber)

如果(OrderCloseTime()>time)

{

history_close_orders++。

time = OrderCloseTime();//最后的订单关闭时间

lot= OrderLots();//最后成交的订单的手数

type=OrderType();//最后关闭订单的类型

profit=OrderProfit()*OrderSwap()*OrderCommission();//最后成交的订单的利润

}

//计算EA将工作的手数

double Lots_Work=0;//工作批次


如果(history_close_orders==0 || profit>0)//如果没有关闭的订单或最后一个订单在利润上关闭。

Lots_Work=Lot;//工作批次等于初始批次。


如果(history_close_orders>0 && profit<0) // 如果最后一笔订单以红色收盘。

Lots_Work=1;//工作手数将等于上一个订单的手数乘以乘数。


//打开第一个买入订单

如果(buy==0 || profit>0)

{

int ticket=OrderSend(Symbol(,OP_BUY,Lots_Work,Ask,Slippage,0,0, "Expert Advisor Test fair",MagicNumber,0,clrGreen);

如果(ticket<0)

Print("OrderSend failed with error #",GetLastError())。

否则

Print("OrderSend completed successfully");

}


// 开启第二笔和后续的买入订单

如果(buy==0 && type==OP_BUY && profit<0)

{

int ticket=OrderSend(Symbol(),OP_BUY,Lots_Work,Ask,Slippage,0,0, "EA Test fair",MagicNumber,0,clrGreen);

如果(ticket<0)

Print("OrderSend failed with error #",GetLastError())。

否则

Print("OrderSend completed successfully");

}


// 第一个卖出订单 的开启

如果(sell==0 || profit>0)

{

int ticket=OrderSend(Symbol(),OP_SELL,Lots_Work,Bid,Slippage,0,0, "EA Test fair",MagicNumber,0,clrRed);

如果(ticket<0)

Print("OrderSend failed with error #",GetLastError())。

否则

Print("OrderSend completed successfully");

}

// 开启第二笔和后续的买入订单

如果(sell==0 &&(type==OP_SELL && profit<0))

{

int ticket=OrderSend(Symbol(,OP_SELL,Lots_Work,Bid,Slippage,0,0, "Expert Advisor Test fair",MagicNumber,0,clrRed);

如果(ticket<0)

Print("OrderSend failed with error #",GetLastError())。

否则

Print("OrderSend completed successfully");

}


//--修改订单,增加获利和止损。

for(int i = OrdersTotal()-1; i>=0; i--)

如果(OrderSelect(i, SELECT_BY_POS))

如果(OrderSymbol()==Symbol())

如果(OrderMagicNumber()== MagicNumber)

{

如果(OrderType()==OP_BUY)

{

如果(OrderStopLoss()==0 || OrderTakeProfit()==0)

如果(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl,Digits(),NormalizeDouble(OrderOpenPrice()+tp,Digits(),0,clrGreen)

Print("OrderModify OK!")。

否则

Print("OrderModify BUY failed #", GetLastError())。

}

如果(OrderType()==OP_SELL)

{

如果(OrderStopLoss()==0 || OrderTakeProfit()==0)

如果(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl,Digits(),NormalizeDouble(OrderOpenPrice()-tp,Digits(),0,clrRed)

Print("OrderModify OK!")。

否则

Print("OrderModify SELL failed #", GetLastError())。

}

}


}

//+------------------------------------------------------------------+


 
我的旧笔记本电脑有i3处理器,仍然安装着WinXP 32位,不支持MT5。最近内存增加到6GB,我想安装64位操作系统,可以运行MT4和MT5。哪个更合适 - Win7或Win8.1 ?
 
atztek #:
我的旧笔记本电脑有i3处理器,仍然安装着WinXP 32位,不支持MT5。最近内存增加到6GB,我想安装64位操作系统,可以运行MT4和MT5。哪个更合适 - Win7或Win8.1 ?

10

 
Andrey Sokolov #:

10

这个版本安装在一台新的笔记本电脑上,厌倦了不断的更新。此外,人们写道,在旧的笔记本电脑上,8块钱比10块钱运行得更好。我想把WinXP留在我的旧笔记本上,但MT5不能在上面运行,而且3Gb的内存对XP来说是不够的。不过,如果在7和8.1之间选择,哪一个更适合在MT4/5上进行优化?