[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 767

 
FoxUA:

是的,部分代码工作,部分代码说4107和130错误,最有趣的是,他们从一个相同的函数中获取价格,并在一个相同的开放函数上工作。


在某处尝试以下结构,这个例子是针对我的情况。

如果(OrderSend(Symbol(),OP_BUYSTOP,Lot,OpenPrice,0,Ask,0,Mg,0,Red)==-1)
Print("Error 1 OP_BUYSTOP ","Open=",OpenPrice,"Stop Loss=",Ask," Trall=",TrallBuy," StopLoss=",StopLoss) ;

请看日志中的结果,

 

鉴赏家们下午好。帮助我理解这个代码...

//+------------------------------------------------------------------+
//|计算未结头寸|
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0。
//----
for(int i=0;i<OrdersTotal();i++)
{
如果(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
如果(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICEA)
{
如果(OrderType()==OP_BUY) buys++;
如果(OrderType()==OP_SELL) sells++;
}
}
//---- 退货订单量
if(buys>0) return(buys)。
否则返回(-sells)。
}

//+------------------------------------------------------------------+
//|计算最佳手数|
//+------------------------------------------------------------------+
双倍拍品尺寸(){
双层地段MM。
如果(PairsTraded==0){
lotMM = MathCeil(AccountFreeMargin() * Risk / 10000) / 10;
} else {
lotMM = MathCeil(AccountFreeMargin() * Risk / 10000 /PairsTraded) / 10 ;
}
如果(MM==true){
如果(lotMM < 0.1)lotMM = Lots;
如果(lotMM > 1.0)lotMM = MathCeil(lotMM);
如果(lotMM > 100)lotMM = MaxLots;
}
else lotMM = Lots;
返回(lotMM)。
}

//+------------------------------------------------------------------+
//| 检查未结订单的情况 |
//+------------------------------------------------------------------+
空白的CheckForOpen()。
{
双重CCI5,CCI15,CCI30,CCIH1,CCIH4。
int 发送。

//----MultitimeFrame CCI设置


CCI5 = iCCI(NULL,PERIOD_M5,50,PRICE_CLOSE,0)。
CCI15 = iCCI(NULL,PERIOD_M15,50,PRICE_CLOSE,0)。
CCI30 = iCCI(NULL,PERIOD_M30,50,PRICE_CLOSE,0)。
CCIH1 = iCCI(NULL,PERIOD_H1,50,PRICE_CLOSE,0)。


//----


//---- 卖出条件
如果((CCIH1<0)&&(CCI30<0)&&(CCI15<0)&&(CCI5<0))//卖出
{
send=OrderSend(Symbol(),OP_SELL,LotSize(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,MagicName+"-Sell",MAGICEA,0,Red)。
返回。
}

//---- 购买条件
如果((CCIH1>0)&&(CCI30>0)&&(CCI15>0)&&(CCI5>0))//op买入
{
send=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,MagicName+"-Buy",MAGICEA,0,Blue)。
返回。
}
}

//----

//+------------------------------------------------------------------+
//| 检查平仓的条件|
//+------------------------------------------------------------------+
空白的CheckForClose()
{
//----


//----
for(int i=0;i<OrdersTotal();i++)
{
如果(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
如果(OrderMagicNumber()!=MAGICEA || OrderSymbol()!=Symbol()) 继续。

//---- 检查订单类型
如果(OrderSymbol()==Symbol() &&OrderType()==OP_BUY &&Bid-TrailingStop*Point > OrderStopLoss()){

如果(Bid > OrderOpenPrice()+TrailingStop*Point) {
OrderModify(OrderTicket(),OrderOpenPrice(), Bid-TrailingStop*Point,0,0,White)。
}
} else {
OrderModify(OrderTicket(),OrderOpenPrice(), Bid-1*Point,0,0,White)。
}
如果(OrderSymbol()==Symbol() &&OrderType()==OP_SELL &&Ask-TrailingStop*Point < OrderStopLoss()){

如果(Ask < OrderOpenPrice()-TrailingStop*Point) {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,0,0,White) 。
}
} else {
OrderModify(OrderTicket(),OrderOpenPrice(), Ask+1*Point,0,0,White)。
}
}

//----
}
//+------------------------------------------------------------------+
//| 启动功能|
//+------------------------------------------------------------------+
空白启动()。
{
//---- 检查历史和交易情况
如果(Bars<100 || IsTradeAllowed()==false) 返回。

//---- 按当前符号计算未结订单
如果(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
否则CheckForClose()。

//----
}
//+------------------------------------------------------------------+

如果我想让它只开一个仓位,而且我不想让它在我关闭后再开,但它在我关闭后开了一个仓位,它又开了。

 
mydone:

鉴赏家们下午好。帮助我理解这个代码...

...代码 ...

我不明白我做错了什么。 我需要它在形成的条件下只打开一个交易,在它关闭后直到下一个条件不再打开......但我的情况是,它打开了,我关闭了例如一个窗口,它又在同一个地方打开了,这是为什么?

你拥有它,只要开放条件存在,它就会开放。

对该信号是否已经开仓进行检查,例如,bool OpnPose = false;在通过该信号开仓 之前,检查该标志,如果没有设置(OpnPose == false),则开仓。当它开盘时,如果它真的开盘并进入市场,你就通过这个信号设置开盘标志:OpnPose = true;一旦有新的信号出现,你就抛弃这个信号:
OpnPose = false。

 
是的,我们可以把它变得更简单,在信号被触发后,放一个计数器,使2或3个蜡烛内没有其他的开盘,这样,如果它手动关闭,没有其他的开盘,计数器在几个蜡烛后取消了开盘禁令。
 

谢谢你

 
Techno:
是的,我们可以把它变得更简单,在信号被触发后,放一个计数器,使2或3个蜡烛内没有其他的开盘,这样,如果它手动关闭,没有其他的开盘,计数器在几个蜡烛后取消了开盘禁令。
而在禁令解除后,EA将再次把订单投入市场......如果EA在10、15或20个烛台后决定平仓,不再开仓,即使信号仍然存在,该怎么办?例如,在周五...
 
artmedia70:
而在禁令解除后,EA将把该订单重新投入市场......如果它在10、15、20根蜡烛后决定平仓,不再开仓,即使信号仍然存在?例如,在周五...
即使在一个蜡烛之后,也会有一个完全不同的信号,必须考虑到。只需等待3个蜡烛图,第一个信号就会消失。顺便说一下,你使用的指标有5、15、30和60的时间,所以3个30或15分钟的烛台就足够了。
 

我的问题是,如果有一个新的订单,如何从例子中做,如果有一个关闭的订单,"if(TotalHistoryOrders<OrdersHistoryTotal())//另一个订单已经出现在历史上",我需要打开一个也被确定

 
FoxUA:

我的问题是,如果有一个新的订单,如何从例子中做,如果有一个关闭的订单,"if(TotalHistoryOrders<OrdersHistoryTotal())//另一个订单已经出现在历史上",我需要打开一个也被确定

当浏览所有订单并筛选出不必要的订单时,计算数字并保存。 如果数字随着新的循环发生变化,这意味着要么有一个新的订单已经打开,要么已经消失了......
 
Techno:
当尝试所有的订单并筛选出不必要的订单时,数一数,记住它,如果数字随着新的循环发生了变化,这意味着新的订单出现或消失了。


我只需要调用函数就可以了,我只需要一行 "如果订单多于1比....就这样",而你却给我提供了一个完整的功能

这就是我存储订单数据的方式

int total_order;            // переменная в которой хранится общее количество открытых ордеров в терминале
int my_total_order;         // переменная в которой хранится общее количество открытых ордеров с нашим Magic
原因: