if (direction==0){ <<<//--Buy--// This gets called upon if all the set-up is apparent.double bsl=buy_stop_price;
double btp=buy_takeprofit_price;
LotSize = (RiskedAmount/(pips_to_bsl/pips))/10; //--// (in process of changing at the moment)if(OpenOrdersThisPair(Symbol())==0) //--//<--- No order open = then open one...
{
int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
}
if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips) //--//<<-- This will 99% of the time be true and the order above will be cancelled and looped in the "for" until the order is triggered.
{
for(int b=OrdersTotal()-1; b >=0; b--)
{
if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==true)
{
Print(" Stop loss value for the order is ", OrderStopLoss());
}
elseif(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==false)
{
Print(" OrderSelect failed error code is ",GetLastError());
}
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
if(OrderType()==OP_BUYSTOP)
if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)
//if(OpenOrdersThisPair(Symbol())==1)
{
DeleteOrder = OrderDelete(OrderTicket());
if(DeleteOrder!=TRUE)Print("Buy Delete Order Last Error = ", GetLastError());
}
if(OpenOrdersThisPair(Symbol())==0)//<<-- If there are no open orders = place a new order.
{
int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green);
if(NewBuyOrder == -1)Print("New Buy Order Last Error = ", GetLastError());
if(NewBuyOrder > 0)Print("NEW BUY ORDER:- Lots to open: ", DoubleToStr(LotSize, Digits), " Entry Price: ", DoubleToStr(buyPrice, Digits),
" Buy Stop Loss: ", DoubleToStr(bsl, Digits), " Buy Take Profit: ", DoubleToStr(btp, Digits), " Magic Number is: ", DoubleToStr(MagicNumber, Digits));
}
}
}
}
int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
}
// where are you checking the return value from the OrderSend() and reporting errors ?if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips) // where is the OrderSelect() ?
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
{
Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
}
. . . 加入一些大括号 .. .
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
{
Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
}
}
2013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: Current Bid: 1.35972 FirstTarget_Buy: 1.379312013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This is the price where half the lots will close.2013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: Order Lots Open = 0.182013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: Order Ticker Number = 92013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.090002013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.010002013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.010002013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: Order Select for closing:- Lots open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 92013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: NEW BUY ORDER:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 82013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: open #9 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: delete #8 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: Checking Buy Order:- Lots to open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 82013.08.0213:33:572013.02.0115:00 trendfishing_play_ground EURUSD,H1: First Buy Order placed:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 7
在我的for循环中,在买入止损单的情况下,如果60EMA大于OrderStopLoss,它将关闭挂单,用新的SL(在60EMA后面)打开一个新的订单,调整止盈以获得1:2的回报,并改变相对于止损点的手数和我的风险状况(例如2%)。
因此,当这一切都在进行时,"当前手数 "也就是OrderSend中的 "LotSize "自定义变量是有效的,但它发送的手数对服务器来说是不正确的?"0.18215"?这可能是一个问题,尽管订单实际上是通过发送的 - 这个问题更多的是与 "这可能是我不能调用 "OrderType==OP_BUY "的原因?
你应该解决这个问题,用你已有的方法验证手数大小 ......你甚至可以在你已有的代码的基础上编写一个单独的函数 来做。
在你的OrderSend()中不使用LotSize,而是使用ValidateLots(LotSize)
不过我怀疑这是否会导致你的问题 ......
啊!真让人沮丧啊!--在这个问题上卡了太久了:(
我不明白为什么这是一个问题,我不能选择一个 "OP_BUY"...我知道我可能已经用尽了这个话题,但如果能在黑暗中找到任何最后的线索,我将非常感激--也谢谢你对我的帮助!!
嗯--是的,我刚刚玩了一下。看来,订单只是被发送过去,因为服务器只允许0.00(小数点后2位)。所以剩下的数字几乎是不相关的。
啊!真让人沮丧啊!--在这个问题上卡了太久了:(
我不明白为什么这是一个问题,我不能选择一个 "OP_BUY"...我知道我可能已经用尽了这个话题,但如果能在黑暗中找到任何最后的线索,我将非常感激--也谢谢你对我的帮助!!
我认为你需要展示你所有的代码.. .
我在这里看到一些问题。
- http://pastebin.com/eaY1wKbN
很抱歉语法问题--有点难看,但他们没有MQL4?所以把它放在C++下
所有的代码在这里都放不下?不过我已经把它放到了Pastebin上?
- http://pastebin.com/eaY1wKbN
很抱歉语法的问题--有点难看,但他们没有MQL4?所以把它放在C++下
没问题 . . .
当你这样做时 . . .
如果你的OrderTicket()失败,你的OrderSelect()就 会失败,除非你已经有一个订单被选中。 你真的需要这段代码吗? 稍后你有一个循环,在那里你选择订单并检查它们的符号和魔法号码和类型。
这也需要修正。
. . . 加入一些大括号 .. .
好吧--我把更多的印刷品打进去,以便更清楚地了解正在做什么和什么要点。我把它粘贴在下面。
上面写着 "选择关闭的订单:-...... "的那一行,就是你上面问的 "关闭OP_BUY半数手@1:1功能 "那一点被选择了。在这个选择点上,票号似乎是不同的?我已经删除了"...&&OrderType()==OP_BUY "部分,因为当这部分不在 "if "语句中时,它似乎会打印其余部分...这是否能让人更清楚一些?
"第一个买入订单:-"是第一个OrderSend函数 开始时的情况。
"检查买入订单:-"是for循环中的一个函数,如果MA>OrderStopLoss(),则删除并重新打开待定订单。
"新买入订单:-"是在for循环中放置的新订单。
"Order Select for closing:-..." - 正如上面已经提到的,这是选择关闭一半手数的部分。
对不起,如果你感到困惑,因为我刚刚添加了这些部分 - 你不会在上面的粘贴链接中看到这些...只是简单的打印功能 :)
好吧--我把更多的印刷品打进去,以便更清楚地了解正在做什么和什么要点。我把它粘贴在下面。
上面写着 "选择关闭的订单:-...... "的那一行,就是你上面问的 "关闭OP_BUY半数手@1:1功能 "那一点被选择了。在这个选择点上,票号似乎是不同的?我已经删除了"...&&OrderType()==OP_BUY "部分,因为当这部分不在 "if "语句中时,它似乎会打印其余部分...这是否能让人更清楚一些?
"第一个买入订单:-"是第一个OrderSend函数开始时的情况。
"检查买入订单:-"是for循环中的一个函数,如果MA>OrderStopLoss(),则删除并重新打开待定订单。
"新买入订单:-"是在for循环中放置的新订单。
"Order Select for closing:-..." - 正如上面已经提到的,这是选择关闭一半手数的部分。
对不起,如果你感到困惑,因为我刚刚添加了这些部分 - 你不会在上面的粘贴链接中看到这些...只是简单的打印功能 :)
试试附件......这是我对你试图做什么的最佳猜测。
啊,太棒了--谢谢你。这是向正确方向迈出的一大步。我想因为它是在一个for循环中,它想关闭一半和一半,一半@价格......。而不是只做一次?不仅如此,当价格>=到我想要的出场价格时,它似乎没有关闭一半,而是超越了它,然后当价格回落到我想要的出场价格时,它就关闭了--奇怪......感谢你耐心地帮助我!非常感谢您的时间!!
更新:另外,我刚刚发现,如果我在运行策略测试器 之前改变专家属性(extern int),那么平仓部分就完全不起作用了--影响平仓部分的东西是 "MA_PadAmount",这是我想给以点为单位的止损增加多少点,以及 "OrderPrice_PadAmount",它允许我指定在订单的进入价格上增加多少点作为垫子...
啊,太棒了--谢谢你。这是向正确方向迈出的一大步。我想因为它是在一个for循环中,它想关闭一半和一半,一半@价格......。而不是只做一次?不仅如此,当价格>=到我想要的出场价格时,它似乎没有关闭一半,而是超越了它,然后当价格回落到我想要的出场价格时,它就关闭了--奇怪......感谢你耐心地帮助我!非常感谢您的时间!!
我不完全确定该怎么写,但这大致上是正确的思路吗?