【发布时间】:2015-12-22 15:48:32
【问题描述】:
在MQL4中,我知道如何设置stopLoss和takeProfit。
但是,当这些事件真正发生时,我想做些别的事情。
是否有任何与此相关的事件监听器?
【问题讨论】:
在MQL4中,我知道如何设置stopLoss和takeProfit。
但是,当这些事件真正发生时,我想做些别的事情。
是否有任何与此相关的事件监听器?
【问题讨论】:
很遗憾,MQL4 中没有交易活动。
但是,它可以这样模拟(仅逻辑代码,可能无法编译):
#property copyright "No copyright, can be used freely, Joseph Lee"
#property link "https://www.facebook.com/joseph.fhlee"
int vaiTicketList[];
int start() {
int viIndex;
// -----------------------------------------------------------
// EVENT CHECK SECTION:
// Check vaiTicketList (populated in the previous cycle) to see if
// each of the (previously) open ticket is still currently open.
// -----------------------------------------------------------
for( viIndex=0; viIndex<ArrayRange(vaiTicketList,0); viIndex++) {
// Check if Ticket which was previously opened in the last
// cycle is no longer open now.
if(!OrderSelect( vaiTicketList[viIndex], SELECT_BY_TICKET ) ) {
// -----------------------------------
// EVENT CATEGORIZATION:
// -----------------------------------
// Handle possible events here:
// -- Close event: (OrderSelect( ticket, SELECT_BY_TICKET, MODE_HISTORY) == true)
if( OrderSelect(vaiTicketList[viIndex], SELECT_BY_TICKET, MODE_HISTORY) )
eventTrade_Closed( vaiTicketList[viIndex] );
// -- StopLoss ( Buy: When OrderClosePrice() <= OrderStopLoss(),
// Sell: When OrderClosePrice() >= OrderStopLoss() )
// -- TakeProfit (Buy: When OrderClosePrice() >= OrderTakeProfit(),
// Sell: When OrderClosePrice() <= OrderTakeProfit() )
// -- Expiration, Cancel, etc, etc
}
}
// -----------------------------------------------------------
// Store a list of all currently OPEN trade tickets into array.
// This is used to be compared in the next tick.
// -----------------------------------------------------------
ArrayResize( vaiTicketList, OrdersTotal() );
for ( viIndex=0; viIndex<OrdersTotal(); viIndex++) {
if(OrderSelect(viIndex, SELECT_BY_POS, MODE_TRADES)) {
vaiTicketList[viIndex] = OrderTicket();
}
}
// -----------------------------------------------------------
};
// ---------------------------------------
// This is the Trade Close event handler
// ---------------------------------------
bool eventTrade_Closed( int pviTicket ) {
bool vbIsEventBubble = true;
// Do something here to handle the event.
// FEATURE: vbIsEventBubble TRUE will allow event bubbles.
return( vbIsEventBubble);
}
bool eventTrade_otherPossibleEvents1() {};
bool eventTrade_otherPossibleEvents2() {};
bool eventTrade_otherPossibleEvents3() {};
bool eventTrade_otherPossibleEventsN() {};
沿着这条线。希望对您有所帮助。
【讨论】:
if(!OrderSelect() 只会在失败时执行,您的代码无法使用。您很可能打算写if(!OrderSelect()) continue;。此外,嵌套的OrderSelect()'s 将确保您的所有订单完全混乱!
OrderSelect()'s 嵌套在 for() 循环中,这是可能的,但通常被认为是一个很大的禁忌,因为项目不按任何顺序返回,如果指针在操作完成之前已经死亡,甚至可能返回垃圾。
您可以使用带有静态变量的 OrdersHistoryTotal() 来识别此事件。如果该值增加,则表示已平仓。
【讨论】:
我们可以创建一个这样的,并在 OnTick() 事件绑定处理程序的基础上测试它的激活。
void OnTick(){ // MQL4 system-initiated event-handler
// ---
myOnTickStealthTP_EventMONITOR(); // my Event Monitor
myOnTickStealthSL_EventMONITOR(); // my Event Monitor
// ---
// other code
}
根据not2qubit 的猜想进行扩展(无论人们认为它是多么切题、弱或错误):
你刚刚发布了一个人为的不存在的功能。那有什么好处?如果您可以为您的建议提供部分工作代码 sn-p,那将会更有帮助。回想 MQL4 的大多数用户不是程序员。 – not2qubit 47 分钟前
void myOnTickStealthTP_EventMONITOR(){ // HERE put everything,
// TP_Event // what the "something else"
// ( when such events
// actually take place
// )
// meant - that's fair, isn't it ?
...
}
void myOnTickStealthSL_EventMONITOR(){ // HERE put everything,
// SL_Event // what the "something else"
// ( when such events
// actually take place
// )
// meant - that's fair, isn't it ?
...
}
【讨论】: