E se si guarda la cronologia del conto per vedere il commento dell'ultimo trade, andrebbe bene?
Qualcosa del genere:
//+------------------------------------------------------------------+ //| Возвращает причину закрытия позиции по Take Profit | //+------------------------------------------------------------------+ bool CAccountHistory::IsClosedByTakeProfit(conststring symbol) { //--- Получим комментарий последней сделки на указанном символе string last_comment=LastDealComment(symbol); //--- Если в комментарии есть строка "tp" if(StringFind(last_comment,"tp",0)>-1) return(true); //--- Если нет строки "tp" return(false); } //+------------------------------------------------------------------+ //| Возвращает причину закрытия позиции по Stop Loss | //+------------------------------------------------------------------+ bool CAccountHistory::IsClosedByStopLoss(conststring symbol) { //--- Получим комментарий последней сделки на указанном символе string last_comment=LastDealComment(symbol); //--- Если в комментарии есть строка "sl" if(StringFind(last_comment,"sl",0)>-1) return(true); //--- Если нет строки "sl" return(false); } //+------------------------------------------------------------------+ //| Возвращает комментарий последней сделки на указанном символе | //+------------------------------------------------------------------+ string CAccountHistory::LastDealComment(conststring symbol) { int total_deals =0; // Всего сделок в списке выбранной истории string deal_symbol =""; // Символ сделки string deal_comment =""; // Комментарий сделки //--- Если история сделок получена if(HistorySelect(0,TimeCurrent())) { //--- Получим количество сделок в полученном списке total_deals=HistoryDealsTotal(); //--- Пройдемся по всем сделкам в полученном списке от последней сделки к первой for(int i=total_deals-1; i>=0; i--) { //--- Получим комментарий сделки deal_comment=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_COMMENT); //--- Получим символ сделки deal_symbol=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_SYMBOL); //--- Если символ сделки и текущий символ равны, остановим цикл if(deal_symbol==symbol) break; } } //--- return(deal_comment); }
Questa non è un'accusa indiscriminata, ma il risultato di ore di tentativi di scoprire (nessuna HistorySelectByPosition e altre cose aiutano) come funziona tutto. E sono felice di scusarmi se mi sbaglio. Per non essere infondato, sto mostrando un Expert Advisor per il tester (è più facile da capire) sul server RoboForexEU-MetaTrader 5, che apre una posizione, poi mette livelli SL e TP.
voidOnTick()
{
staticbool Flag = true;
if (Flag)
{
// Открываем SELL-позициюMqlTradeRequest Request = {0};
Request.action = TRADE_ACTION_DEAL;
Request.symbol = Symbol();
Request.volume = 1;
Request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);
Request.type = ORDER_TYPE_SELL;
MqlTradeResult Result;
if (OrderSend(Request, Result))
{
// Устанавливаем SL и TP
Request.position = Result.deal;
Request.action = TRADE_ACTION_SLTP;
Request.tp = Result.ask - 10 * _Point;
Request.sl = Result.ask + 10 * _Point;
if (OrderSend(Request, Result))
Print("Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста") ;
Flag = false;
}
}
}
In questo EA, SL e TP di una singola posizione chiusa non possono essere definiti (in OnDeinit). È previsto che lo faccia?
Chi può risolvere - definire SL e TP di una posizione chiusa?
Non scrivo EAs su ordinazione, specialmente per il FOREX.
Ora avete tutte le conoscenze necessarie per scrivere un codice sensato,
che soddisfa le vostre esigenze.
E chi le ha chiesto di scrivere su ordinazione?
Fare una domanda su questo forum al giorno d'oggi significa scrivere per ordinare?
Andate all'inferno, tutti quanti. Voi venditori.
...
E se si guarda la cronologia del conto per vedere il commento dell'ultimo trade, andrebbe bene?
Qualcosa del genere:
//| Возвращает причину закрытия позиции по Take Profit |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByTakeProfit(const string symbol)
{
//--- Получим комментарий последней сделки на указанном символе
string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "tp"
if(StringFind(last_comment,"tp",0)>-1)
return(true);
//--- Если нет строки "tp"
return(false);
}
//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Stop Loss |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByStopLoss(const string symbol)
{
//--- Получим комментарий последней сделки на указанном символе
string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "sl"
if(StringFind(last_comment,"sl",0)>-1)
return(true);
//--- Если нет строки "sl"
return(false);
}
//+------------------------------------------------------------------+
//| Возвращает комментарий последней сделки на указанном символе |
//+------------------------------------------------------------------+
string CAccountHistory::LastDealComment(const string symbol)
{
int total_deals =0; // Всего сделок в списке выбранной истории
string deal_symbol =""; // Символ сделки
string deal_comment =""; // Комментарий сделки
//--- Если история сделок получена
if(HistorySelect(0,TimeCurrent()))
{
//--- Получим количество сделок в полученном списке
total_deals=HistoryDealsTotal();
//--- Пройдемся по всем сделкам в полученном списке от последней сделки к первой
for(int i=total_deals-1; i>=0; i--)
{
//--- Получим комментарий сделки
deal_comment=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_COMMENT);
//--- Получим символ сделки
deal_symbol=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_SYMBOL);
//--- Если символ сделки и текущий символ равны, остановим цикл
if(deal_symbol==symbol)
break;
}
}
//---
return(deal_comment);
}
E se si guarda la cronologia del conto per vedere il commento dell'ultima transazione, andrebbe bene?
Qualcosa del genere:
Grazie uomo gentile!
Probabilmente il modo più affidabile, dato che SL e TP possono scivolare e confrontare i prezzi sarebbe inutile.
E se si guarda la cronologia del conto per vedere il commento dell'ultima transazione, andrebbe bene?
Qualcosa del genere:
E se non ci sono commenti (il che è del tutto possibile)?
Questo è probabilmente il modo più affidabile, dato che SL e TP possono scivolare e un confronto dei prezzi sarebbe inutile.
{
int OrderType=(int)::HistoryOrderGetInteger(OrderTicket,ORDER_TYPE);
if((OrderType==ORDER_TYPE_BUY) || (OrderType==ORDER_TYPE_SELL))
{
const string OrderComment=HistoryOrderGetString(OrderTicket,ORDER_COMMENT);
const string OrderPrice=::DoubleToString(::HistoryOrderGetDouble(OrderTicket,ORDER_PRICE_OPEN),
(int)::SymbolInfoInteger(HistoryOrderGetString(OrderTicket,ORDER_SYMBOL),SYMBOL_DIGITS));
if(OrderComment=="tp "+OrderPrice)
OrderType=ORDER_TYPE_TAKEPROFIT;
else if(OrderComment=="sl "+OrderPrice)
OrderType=ORDER_TYPE_STOPLOSS;
}
return(OrderType);
}
E se non c'è nessun commento (il che è del tutto possibile)?
Abbastanza possibile, naturalmente. Io uso questo per analizzare la storia nel tester, come il più semplice e veloce.
In questo caso, devo fare e analizzare biglietti con ordini pendenti. Non ho un esempio pronto a portata di mano.
chiuso una posizione .
Questa non è un'accusa indiscriminata, ma il risultato di ore di tentativi di scoprire (nessuna HistorySelectByPosition e altre cose aiutano) come funziona tutto. E sono felice di scusarmi se mi sbaglio. Per non essere infondato, sto mostrando un Expert Advisor per il tester (è più facile da capire) sul server RoboForexEU-MetaTrader 5, che apre una posizione, poi mette livelli SL e TP.
In questo EA, SL e TP di una singola posizione chiusa non possono essere definiti (in OnDeinit). È previsto che lo faccia?
Abbastanza possibile, naturalmente. Io uso questo per analizzare la storia nel tester, come il più semplice e veloce.
E così con gli ordini pendenti è necessario fare e analizzare i biglietti. Non ho un esempio pronto a portata di mano.
Cosa non ti è piaciuto di questo metodo?
if (trans.order != my_order_ticket)
{
//Сработал SL или TP
}
break;
Cosa c'è di sbagliato in questo metodo?
if (trans.order != my_order_ticket)
{
//Сработал SL или TP
}
break;
Sì, è più o meno così. Solo che non l'ho ancora testato in questo modo.
Prova...
Aggiunto da
if (trans.order != my_order_ticket)
{
if(trans.symbol==Symbol())
{
if(проверяем магик)
{
//Сработал SL или TP
}
}
}
break;