int start()
{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{
OrderEntryTime = OrderOpenTime();
datetime OrderEntryClosed = OrderCloseTime();
CurrentSymbol = OrderSymbol();
if(OrderType() <= OP_SELL && CurrentSymbol == Symbol())
{
Print(" The Selected Order ", CurrentSymbol, " matches this pair: ", Symbol());
Print(" The Open Time of this order was: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
}
if(OpenOrdersThisPair(Symbol())>0 && CurrentSymbol==Symbol())
{
// Need a for loop to compare historically closed trades that match with Symbol() and the "datetime OrderEntryTime = OrderOpenTime();" above.
CheckHistoricalTrades();
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CheckHistoricalTrades()
{
for(int Pos=OrdersHistoryTotal()-1; Pos >= 0; Pos--)
{
if (OrderSelect(Pos, SELECT_BY_POS, MODE_HISTORY)
&& OrderMagicNumber() == MagicNumber
&& CurrentSymbol == Symbol()
&& OrderType() <= OP_SELL
&& OrderEntryTime > OrderOpenTime() && OrderType()==OP_BUY)
{
Print(" Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE),
" Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
CloseHalfOrder();
}
if(OrderEntryTime > OrderOpenTime() && OrderType()==OP_SELL)
{
Print("Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE),
" Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
CloseHalfOrder1(); // This just closes half of the position at 1:1 - then if OrderStopLoss > OrderOpenPrice() = MoveToBreakEven() void kicks in.
}
}
}
2013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.0409:22 Was not the same as current order: 2010.02.2501:16 //>>> "Last Order Open time" here doesn't make sense?2013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: SELL First Target Closed: 0.03 OP_SELL First Closed - Open Time: 2010.02.0515:07 //>>> This is the same as "The Last Order Open Time"?2013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: close #16 sell 0.03 GBPJPY at 138.270 sl: 138.240 tp: 135.082 at price 136.637 //>>> Therefore, it closed it here.2013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: Ask >= FirstTarget_Sell - Current Ask: 136.637 FirstTarget_Sell: 136.676 //>>> The ask is at the OrderClose() price.2013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: FirstTarget_Sell: 136.6762013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: Order Ticker Number = 102013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: The Lots to close is: 0.0302013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.0515:07 Was not the same as current order: 2010.02.2501:162013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: The Open Time of this order was: 2010.02.2501:162013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: The Selected Order GBPJPY matches this pair: GBPJPY
我知道问题就在我面前,但我看不到......。
但我遇到的问题是,我正试图以不同的价格部分关闭同一个 "OP_BUY "或 "OP_SELL "多达4次。我想我应该问的问题是,我能否得到一种方法,即我有一个规则,所有的部分平仓(任何手数和价格的一个给定的交易)将只在其预定义的 "OrderClose() "参数设置中部分平仓一次...我现在正在考虑的这种比较OrderOpenTime()的方式基本上只起一次作用,并将限制任何其他类型的OrderClose()函数的发生...。我想找到一种方法,我可以让一条规则适用于4个OrderClose()函数...(如果这有意义的话?) 我知道人们建议开4个订单,但在不太深入的情况下,这样做对我来说效率较低。
为什么不简单地用一个二维数组来存储票号和剩余的可用部分关闭的数量。
概要/伪代码。
1.定义静态二维数组:cOrders[][2]。
2. 对于每个新输入的订单:将cOrders的第一个维度调整为size+1,将新订单的票号放在[x][0]中,将剩余的部分关闭数量(在本例中为4)放在[x][1]中。
3.在任何时间间隔(例如,每个start()),循环浏览数组,使用存储的票号选择每个订单,并确定是否需要执行部分关闭。
4. 如果需要执行部分关闭(见步骤3),使用OrderClose()部分关闭订单,更新cOrders[x][0]以反映新的票号,并将cOrders[x][1]减少1。
5.从cOrders中删除 任何已经关闭的订单,或其剩余的部分关闭数量为0。
唯一的问题是在平台/计算机重新启动时该怎么做。你可以将这些信息存储在一个文件中,并在平台重新启动时在init()中读取该文件。
为什么不简单地用一个二维数组来存储票号和剩余的可用部分关闭的数量。
概要/伪代码。
1.定义静态二维数组:cOrders[][2]。
2. 对于每个新输入的订单:将cOrders的第一个维度调整为size+1,将新订单的票号放在[x][0]中,将剩余的部分关闭数量(在本例中为4)放在[x][1]中。
3.在任何时间间隔(例如,每个start()),循环浏览数组,使用存储的票号选择每个订单,并确定是否需要执行部分关闭。
4. 如果需要执行部分关闭(见步骤3),使用OrderClose()部分关闭订单,更新cOrders[x][0]以反映新的票号,并将cOrders[x][1]减少1。
5.从cOrders中删除任何已经关闭的订单,或其剩余的部分关闭数量为0。
唯一的问题是在平台/计算机重新启动时该怎么做。你可以将这些信息存储在一个文件中,在平台重启时在init()中读取该文件。
我不知道如何使用魔法数字的一部分来定义不同的参数?我认为使用OrderOpenTime()不会是一个合理的途径......我无法相信这个主题变得这么长。大笑。
我向上帝发誓,一旦我(在大家的帮助下)破解了这个问题,我一定要做一个主题。
我认为最简单的方法是用魔法号码 . . . 使用部分号码来定义不同的参数,例如:零件数、订单号、日、月、EA号码 . . . 所有零件都有相同的魔法号码,可以在历史记录中轻松追踪。 我假设封闭的部分和开放的部分都有相同的魔术号码 ......
使用 "魔数 "来编码信息片段是很有可能的,但我认为有几个可能的限制。 首先,魔术号码是一个int,因此有10位数字,其中最左边的数字只能是1或2(如果最左边的数字是2,最左边的第二位数字必须是7或更少)。 其次,每个start()可能需要更多的时间来查看所有的历史记录,找到每个订单的所有部分,以确定当前订单是否需要(或可以)部分关闭。 只是不确定这更多的时间是否是微不足道的。
等等,我就不能有几个magicnumbers吗?在最初的OrderSend()中使用一个,在OrderModify()中使用一个,在第一个目标1:1关闭一半的头寸后,修改订单以改变MagicNumber?因此,当我第一次希望以1:1的价格平掉一半时,只要当前的开仓 "OP_BUY "与我第一次给它的魔法数字相对应,它就只会 以1:1的价格平掉?然后在它部分关闭后,修改并改变那个神奇的数字?
傻子?这不是真的很简单吗?
更新:我今天显然需要停止看这个 - 你不能修改MagicNumber - 希望你他妈的可以.......(facepalm) - 你能想象这一切会有多容易吗...
等等,我就不能有几个魔法号码吗?在最初的OrderSend()中使用一个,在OrderModify()中使用一个,在一半的头寸以1:1的第一个目标关闭后,修改订单以改变MagicNumber?因此,当我第一次希望以1:1的价格平掉一半时,只要当前的开仓 "OP_BUY "与我第一次给它的魔法数字相对应,它就只会以1:1的价格平掉?然后在它部分关闭后,修改并改变那个神奇的数字?
傻子?这不是真的很简单吗?
首先,在最初的OrderSend()之后,你不能用OrderModify() 添加/修改魔法号码。 第二,当你使用OrderClose()进行部分订单关闭时,新的订单(我想)会得到与旧订单相同的魔法号码。
首先,在最初的OrderSend()之后,你不能用OrderModify() 添加/修改魔法号码。 第二,当你使用OrderClose()进行部分订单关闭时,新的订单(我想)会得到与旧订单相同的魔法号码。
是的,我意识到我是多么的弱智。漫长的一天!
是的,在第一次部分平仓后,剩余的头寸仍然被分配到与它第一次开始时相同的魔法号码。
这真的让我很沮丧......如果我可以修改magicnumber就好了,这太容易了!?必须有一个合理的方法来部分平仓一次--并在OrderClose()中指定的任何预定义价格上多次平仓--需要有一个更新来允许我们修改MagicNumber()!
你的思考方式完全不符合逻辑。
1.修改这个神奇的数字怎么会比知道OrderOpenTime()更能帮助你? 它相当于该订单的标识符,是完全一样的东西。
2.你为什么要用timetostr将其转换为日/小时/分钟的格式? OrderOpenTime()已经是时间戳的格式,它看起来像这样。1375356521,它代表了订单打开时的精确时间。
如果你能改变魔法数字,你会比较订单的魔法数字,以确保它没有魔法数字,这意味着它已经关闭了一部分,对吗?
如果你能做到这一点,为什么你不能将订单的OrderOpenTime与你知道的意味着它已经部分关闭的时间戳进行比较?
static datetime alreadypartclosed;
如果部分关闭的订单是成功的
alreadypartclosed = OrderOpenTime();
当订单符合部分关闭的标准时
if(OrderOpenTime() != alreadypartclosed )
如果你同时管理多个未结订单,使用一个数组[]来保存每个部分关闭订单的时间戳。