任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 1100

 

尊敬的程序员们,请你们帮我设置一个禁令,禁止一次开出多个系列的交易(系列是指如果订单在亏损或零的情况下被关闭,然后在同一个工具上开出下一个交易,但手数更大),也就是说,如果你开出一个系列的交易,第二个和随后的交易就被放在其他工具上的禁令下(机器人同时在不同工具上工作)。我认为这应该通过终端的全局变量 来完成,但我没有足够的知识和经验,我刚刚开始学习MQL。这是一个二元期权顾问。以下是代码

外置双数Lots = 1; // Lots

extern int Exp = 1; // 过期时间

外部int Wait = 1; // 一个方向的烛台数量

extern int Timeout = 1; // 时间间隔

外置双倍数Multiplier = 3; // 倍增器

外部int Slippage = 5; // Slippage

外来int Magic = 2090; // Magic


int票,类型。

双倍价格,地段。

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

//|专家初始化功能|

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

int OnInit()

{

return(INIT_SUCCEEDED)。

}

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

//|专家去初始化函数|

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

空白的OnDeinit(const int reason)。

{

}

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

//|专家勾选功能|

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

空白的OnTick()

{

// --------------- 公开交易 ---------------

if (OrdersTotal() == 0) // 订单数量必须等于零

{

如果((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY) )

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))

// 如果最后一笔交易是亏损的,则开出相同的交易,但手数更大。

{

类型=TypeLastHistOrder()。

如果(Type == OP_BUY) Price = Ask;

如果(类型== OP_SELL)价格=Bid。

Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

如果(PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)。

// 如果上一次交易的利润等于零,则将开出相同的交易。

{

类型=TypeLastHistOrder()。

如果(Type == OP_BUY) Price = Ask;

如果(类型== OP_SELL)价格=Bid。

Lot = NormalizeDouble(LotsLastHistOrder(), 2);

ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

如果((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL) )

|| CountHistTrades() == 0)//如果最后一笔交易是盈利的,订单就会被打开。

{

如果(SignalBuy() && OrdersTotal() == 0)

{

ticket = OrderSend(Symbol(, OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic)。

}

如果(SignalSell() && OrdersTotal() == 0)

{

ticket = OrderSend(Symbol(, OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic)。

评论("PriceCloseLastHistOrder(OP_BUY)=", PriceCloseLastHistOrder(OP_BUY), "PriceCloseLastHistOrder(OP_SELL)=",

PriceCloseLastHistOrder(OP_SELL))。

}

}

}

}

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

int CountTrades(int type = -1) // 确定交易的数量

{

int cnt = 0。

for (int i=OrdersTotal()-1; i>=0; i--) // 这个循环绝对会经过所有未结订单,i是订单号。

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // 该函数检查订单号为i的订单是否在市场中。

// 如果有,将检查以下条件...

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)) // 如果符号

//订单开启的符号等于当前符号,订单类型等于当前EA设置中的魔术,并且

//订单类型等于类型(或类型==-1(在订单计数需要哪种类型并不重要的情况下))。

cnt++; // 1被添加到cnt变量中,在循环结束时cnt将等于交易的数量。

//由当前的EA为当前的货币对打开,并具有一定的类型。

}

}

return(cnt); // 返回cnt变量的值。

}

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

int CountHistTrades(int type = -1)

{

int cnt = 0。

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

{

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

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

cnt++。

}

}

return(cnt)。

}

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

bool SignalBuy()

{

for (int i=1; i<=Wait; i++)

{

如果(Close[i]>Open[i])返回(false)。

}

如果((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout) )

&& CountHistTrades() > 0) return(true)。

如果(CountHistTrades() ==0)返回(true)。

return(false)。

}

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

bool SignalSell()

{

for (int i=1; i<=Wait; i++)

{

如果(Close[i]<Open[i])返回(false)。

}

如果((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout) )

&& CountHistTrades() > 0) return(true)。

如果(CountHistTrades() ==0)返回(true)。

return(false)。

}

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

datetime TimeLastHistOrder(int type = -1)

{

datetime lasttime = 0;

datetime opentime = 0;


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

{

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

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

如果(OrderCloseTime() > lasttime)

{

lasttime = OrderCloseTime();

opentime = OrderOpenTime()。

}

}

}

}

return(opentime)。

}

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

int TypeLastHistOrder()

{

datetime time = 0;

int type = -1;

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

{

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

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

如果(OrderCloseTime() > time)

{

time = OrderCloseTime()。

type = OrderType()。

}

}

}

}

return(type)。

}

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

double LotsLastHistOrder(int type = -1)

{

datetime time = 0;

double lots = 0;

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

{

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

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

如果(OrderOpenTime() > time)

{

time = OrderOpenTime()。

时间 = OrderLots()。

}

}

}

}

return(lot)。

}

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

double PriceCloseLastHistOrder(int type = -1)

{

datetime time = 0;

双倍价格=0。

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

{

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

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

如果(OrderCloseTime() > time)

{

time = OrderCloseTime()。

price = OrderClosePrice()。

}

}

}

}

}

}

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

double PriceOpenLastHistOrder(int type = -1)

{

datetime time = 0;

双倍价格=0。

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

{

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

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

如果(OrderCloseTime() > time)

{

time = OrderCloseTime()。

price = OrderOpenPrice()。

}

}

}

}

}

}

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

 
你好,同事们!

,我在编程时有个问题:有没有办法在EA中把服务器时间 精确到毫秒
例如,得到。23.09.2016 14h.:53分钟。: 54000毫秒?这正好是54秒,000毫秒。
 
e-partner:
同事们好!

我在编程时有个问题:是否有可能在专家顾问中以某种方式获得精确到毫秒 服务器时间
例如,得到。23.09.2016 14h.:53分钟。: 54000毫秒?这正好是54秒,000毫秒。

有趣的问题。你的意思是,指定 最后已知的服务器时间,最后引用TimeCurrent()的时间或服务器上的当前时间?

如果是TimeCurrent(),那么,如果我们考虑到一个带有新报价的数据包从服务器到终端要经过10-500毫秒的互联网,而且这个时间在不同的数据包之间是不同的,那么,它将有什么用呢?此外,不清楚的是,如果最后的报价从几个来源、流动性提供者来到服务器,然后被处理,然后服务器发送一个新的勾选,那么最后的报价是什么到达。另外,不知道服务器的系统计时器是如何与天文时间同步的。在2014年1月9日04:15至06:15 MSK(星期四,交易日),我在发现这一点,因为偏差不是来自天文数字,而是来自31家公司的平均数。25个时间点的图显示了这些偏差(单位是秒,而不是毫秒)。

而从服务器的数据中以毫秒为单位计算出任何东西的意义何在?

第二个选项更清晰。如果你的电脑与天文时间同步,而且精度是你知道的,那么服务器运行所在城市的天文时间也是同样的精度。但为什么你需要它...

 

我搞不清楚策略测试器 的优化去了哪里。检查都是站着的,我什么都不明白。MT4 build 1010。Windows 8.1。

请告知如何启用优化。

我将附上屏幕截图。我无法看到优化按钮。

附加的文件:
desktop.zip  129 kb
 
为什么我的MT4 b1010不允许对历史数据进行调试(按钮和菜单项没有激活)?在MT5中,一切都很好。
 
因为开发商已经禁止了。
 
int Magik;
int Slippage = 5,stopL1 = 50,takeP1 = 20;
int trend,TicketS,TicketB。
双重rsi,TP,SL。
//+------------------------------------------------------------------+
//|专家初始化功能|
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits == 3 || Digits == 5)
{
滑移*=10。
stopL1 *= 10。
{ takeP1 *= 10;
}

return(INIT_SUCCEEDED)。
}
//+------------------------------------------------------------------+
//|专家去初始化函数|
//+------------------------------------------------------------------+
空白的OnDeinit(const int reason)。
{

}
//+------------------------------------------------------------------+
//|专家勾选功能|
//+------------------------------------------------------------------+
空白的OnTick()
{
double priseBuy = FindLastOrderPrise(OP_BUY)。
double priseSel = FindLastOrderPrise(OP_SELL)。
double frezeelevl = MarketInfo(OrderSymbol(),MODE_FREEZELEVEL);
rsi = iRSI(Symbol(),PERIOD_D1,7,PRICE_CLOSE,0);
trend = WhatTrend()。
如果(CountTrades() ==0)
{
如果(趋势==1 &&rsi <=30)
{
如果(OrderSend(Symbol(),OP_BUYLIMIT,0.10,Ask,Slippage,0,0, "首次买入订单设置",Magik,0)== true)
{
TicketB = FindLastTicket(OP_BUY)。
如果(TicketB >0)
{
SL = priseBuy + NormalizeDouble(takeP1 * Point,Digits)。
TP = priseBuy - NormalizeDouble(stopL1 * Point,Digits)。
如果(OrderModify(TicketB,priseBuy,SL,TP,0)== true)
评论("hooraaaahhhh")。
}

}
}// 如果(trend == 1 && rsi <= 30)
否则如果(趋势==2 &&rsi >= 70)
{
如果(OrderSend(Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0, "first order set",Magik,0)== true)
{
for(int i = OrdersTotal()-1;i >0;i--)
{
OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)。
如果(OrderType()== OP_SELL && OrderMagicNumber() == Magik)
{
double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point, Digits);
如果(OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)==true)休息。
否则继续。
}
}
}
}
}// (CountTrades() == 0)

}

我想请有能力的程序员解释一下我的错误是什么? 为什么顺序没有被修改!!!而且编译器在这样做的时候没有给出错误。

 
我已经学习了教程,我已经阅读并做了笔记......你能具体指出错误吗......因为编译器没有给出错误,测试器中也没有错误,但顺序没有修改。
 
burbur87:
我研究了教程.我读了并做了笔记.你能具体指出错误吗......因为编译器没有给出任何错误,测试器中也没有错误.但顺序没有修改.就像程序中根本看不到顺序一样

仔细阅读OrderSend()返回的内容

 if(OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0) > 0)

实际上,我会做以下工作。

   int ticket=OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0);
   if(ticket>=0)
      {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
          {
            if (OrderStopLoss()==0 || OrderTakeProfit()==0)
             {
               double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
               double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)) Print("Error ",GetLastError()," modify order ",ticket);
             }
          }
      }
 
Sepulca:

仔细阅读OrderSend()返回的内容

if(ticket>=0)

事实上,我会这样做的。

一张票可以是零吗?