//+------------------------------------------------------------------+ //| Возвращает причину закрытия позиции по 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); }
今までOnTradeTransaction()イベントを処理したことはなく、取引ロジックで何がトリガーになるかを考える必要がなかったため、処理する必要がなかったのです。SLまたはTP。これが私のトレード経験の証拠だとでも言うのでしょうか)))。
よく読んでいるのですが、動作するコードという形で賢明な答えを出している人がいないようです。それとも、偉大なるクソ秘密と偉大なる魔法使い-秘密の知識と何が効果的かを判断する能力-なのでしょうか?
特にFOREXの場合、注文するEAは書きません。
これで、賢明なコードを書くのに必要な知識はすべて揃ったことになります。
お客様のニーズに合わせた
特にFOREXの場合、注文するEAは書きません。
これで、賢明なコードを書くために必要な知識はすべて揃ったことになります。
お客様のニーズに合わせた
また、誰に頼まれて注文書を書いたのですか?
この掲示板で質問するということは、いまや注文を書くということなのでしょうか。
地獄に落ちろ、お前ら全員あなたは売り手です。
...
また、口座履歴で最後の取引の解説を見れば、OKでしょうか?
そんな感じです。
//| Возвращает причину закрытия позиции по 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);
}
また、口座履歴で最後の取引の解説を見ればOKでしょうか?
そんな感じです。
親切な方、ありがとうございます。
SLとTPが滑ることがあり、価格を比較しても意味がないことを考えると、おそらく最も確実な方法でしょう。
また、口座履歴で最後の取引の解説を見ればOKでしょうか?
そんな感じです。
もし、解説がなかったら(これは十分にあり得ることですが)?
SLやTPが滑ることもあり、価格比較は意味がないことを考えると、これが一番確実な方法でしょう。
{
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);
}
コメントがない場合はどうするのか(これは十分にあり得ることだが)。
もちろん、かなり可能性があります。テスターで履歴を解析するときに、一番簡単で早いので、これを使っています。
この場合、私は保留中の注文で チケットを作成し、分析する必要があります。手元に用意できる例がない。
ポジションをクローズ した後にMQL5経由でそのtakeprofitとstoplossの 値を知ることはできないのです。
これは無差別に非難しているのではなく、何時間もかけて、すべてがどのように動くのか(HistorySelectByPositionやその他のものは役に立ちません)を見つけようとした結果なのです。そして、もし間違っていたら、喜んで謝ります。杞憂ではなく、RoboForexEU-MetaTrader5サーバーでテスター用のExpert Advisor(その方がわかりやすい)を表示しており、ポジションを開いてからSLとTPレベルをつけています。
このEAでは、(OnDeinitで)1つのクローズポジションのSLとTPを定義することはできません。そういうものなのでしょうか?
もちろん、かなり可能性があります。テスターでの履歴の解析は、一番簡単で早いのでこれを使っています。
そして、保留中の注文では、チケットの実行と分析が必要です。手元に既成の例がないのです。
この方法のどこが合わなかったのでしょうか?
if (trans.order != my_order_ticket)
{
//Сработал SL или TP
}
break;
この方法の何が問題なのでしょうか?
if (trans.order != my_order_ticket)
{
//Сработал SL или TP
}
break;