テスターでのクリアランス - ページ 6

 
Roman Shiredchenko #:

また、組織的な問題もあります。もし、それを解決する最善の方法を知っている人がいたら、ぜひ言葉で書いてください。

一般的に、どのように注文サイクル、新しいポジションを理解する - PROFITが開始されました - アカウントに位置の平均開始価格を取るために(クリアは、その値を変更します)。

はっきり言って、端末から自分でキーで操作するのも、マジックを持ったロボットで操作するのも、どちらも可能なのですが......。

一般的に、私はレポートポイントが必要です - ポジションの平均エントリー価格を計算するために。

ロボットなしでターミナルからサイクルを開始するように、ここからデータを使用して、例えば、前のポジションが利益でクローズした時間を読み取り、そこから実際のサーバーの時間との差を取ることはできますか?

こんな感じの意味です。

過去のポジションがプラスになっているように - では、現在のサイクル会計はすでに始まっています。そして注文 - 集計ポジションの平均エントリー価格を計算するためには、すでにエントリー価格とボリュームの両方をカウントする必要があります...

https://www.mql5.com/ru/articles/211


--------------------------------------------------------------

もちろん、理想的には、前のサイクルの結果(利益や損失)に関係なく、クローズすることが望ましい。

開始 - 新しいものは、コード内の計算のためにマークされた - 平均の新しい現在のサイクルの平均価格、例えば、またはフィル - それは重要ではありません...

最終的なポジションの平均価格を計算できる方は いらっしゃいませんか?カウントとコード修正に疲れてきた~石花が効かない......:-)

OnTrade Transaction () で様々な方法を試しましたが、多くの余分なものが計算に入り、結果的にロットが2倍になり、それは正しくありません。

イベント情報

「例えば、成行買い注文を出すと、それが処理され、口座に適切な買い注文が作成され、その注文が執行され、未決済のもののリストから削除され、注文履歴に追加され、そして適切な取引が履歴に追加され、新しいポジションが作成されるのである。これらの行為はすべて貿易取引である

"

オン・トレード取引()を経由して行われます。

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {


 if ((Hour() <= 13 && Minute() < 44) || (Hour() >=14 && Minute() > 5) || 
          (Hour() <= 18 && Minute() < 44) || (Hour() >=19 && Minute() > 5)) 
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)   //TRADE_TRANSACTION_DEAL_ADD)
   
     {
      long deal_type = -1;
      long deal_entry = -1;
      long deal_magic = 0;

      double deal_volume = 0;
      double deal_price  = 0;
      string deal_symbol = "";

      if(HistoryDealSelect(trans.deal))
        {
         // Print(" deal_entry == DEAL_ENTRY_IN, last_price = ",last_price, " last_lots = ",last_lots);

         deal_type    = HistoryDealGetInteger(trans.deal, DEAL_TYPE);
         deal_entry   = HistoryDealGetInteger(trans.deal, DEAL_ENTRY);
         deal_magic   = HistoryDealGetInteger(trans.deal, DEAL_MAGIC);

         deal_volume  = HistoryDealGetDouble(trans.deal, DEAL_VOLUME);
         deal_price   = HistoryDealGetDouble(trans.deal, DEAL_PRICE);
         deal_symbol  = HistoryDealGetString(trans.deal, DEAL_SYMBOL);
         Print(" deal_entry == DEAL_ENTRY_IN, deal_price = ", deal_price, " deal_volume = ", deal_volume);
        }
      else
         return;

      if(deal_symbol == _Symbol) // && deal_magic == MagicNumber)

         if(deal_entry == DEAL_ENTRY_IN && (deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL))
           {
            // last_price    = deal_price;
            last_pos_type = (deal_type == DEAL_TYPE_BUY) ? POSITION_TYPE_BUY : POSITION_TYPE_SELL;
            // last_lots     = deal_volume;


          
            if (deal_type == DEAL_TYPE_BUY)
             {
              if(deal_volume > 0)  
              if (!PositionSelect(_Symbol) ||
                 (PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY   && 
                 NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) < last_price))
                        
             
              {
               // расчет средней цены СОВОКУПНОЙ ПОЗИЦИИ для общего случая - входа, как руками, так и роботом 
               last_price = (last_price * last_lots + NormalizeDouble(deal_price,_Digits) *
                             NormalizeDouble(deal_volume,0)) / (last_lots +  NormalizeDouble(deal_volume,0));
               last_price = NormalizeDouble(last_price,_Digits);
               
               last_lots = last_lots + NormalizeDouble(deal_volume,0); // накапливаем совокупный объем
              }
            Print(" OnTradeTransaction_BUY: last_price_BUY = ",last_price, " last_lots_BUY = ",last_lots, " N_max_B = ", N_max_B);
           }
           
         if (deal_type == DEAL_TYPE_SELL)
             {
              if(deal_volume > 0)  
              if (!PositionSelect(_Symbol) ||                
                 (PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL &&
                   (NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) == 0 ||
                    NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) > last_price ))) 
                        
             
              {
               // расчет средней цены СОВОКУПНОЙ ПОЗИЦИИ для общего случая - входа, как руками, так и роботом 
               last_price = (last_price * last_lots + NormalizeDouble(deal_price,_Digits) *
                             NormalizeDouble(deal_volume,0)) / (last_lots +  NormalizeDouble(deal_volume,0));
               last_price = NormalizeDouble(last_price,_Digits);
               
               last_lots = last_lots + NormalizeDouble(deal_volume,0); // накапливаем совокупный объем
              }
            Print(" OnTradeTransaction_SELL: last_price_SELL = ",last_price, " last_lots_SELL = ",last_lots, " N_max_S = ", N_max_S);
           }   
           
         } // к if(deal_entry == DEAL_ENTRY_IN && (deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL))
     }
  }

この種のf-i -ロットでは、平均的なポジションのエントリ価格計算(ネッティング)が正しくカウントされません。


オンデマンドで行う方が簡単かもしれません。

今、オン・トレード()を通して見ているのですが、全てここで説明されているので、あとはコードに計算を入れるだけ、それだけなのですが...。基本的に。

https://www.mql5.com/ru/articles/40


基本的には、こんなデザインです。ポジションが増えたら、平均価格を計算することになります。ポジションがクローズされると、すべての中間変数がゼロになる必要があります。基本的に、そこではすべてが初歩的なことなのです。

課題は、清算中のポジション開始価格の変化(清算時のシンボル価格と等しくなった時)を除外することです。

すなわち、コードで読み取ることです。

Обработка торговых событий в эксперте при помощи функции OnTrade()
Обработка торговых событий в эксперте при помощи функции OnTrade()
  • www.mql5.com
В 5-ой версии языка MQL появилась масса нововведений, в том числе работа с событиями различных типов (события таймера, торговые события, пользовательские и т.д.). Возможность обработки событий позволяет создавать совершенно новый тип программ для автоматического и полуавтоматического трейдинга. В этой статье мы рассмотрим торговые события и напишем для функции OnTrade() код, который будет обрабатывать событие Trade.
 
Roman Shiredchenko #:

最終的なポジションの平均価格を計算するためのデザインは誰も用意していない のですか?コードを数えて修正するのに疲れてきた......うまくいかない......:-)

ここで、私の古い、しかしまだ「戦っている」コードの一部を紹介します。

               Pr=HistoryDealGetDouble(DealTicket,DEAL_PRICE);
               Vol=HistoryDealGetDouble(DealTicket,DEAL_VOLUME);
               if(st.Pos==0.0)
                  st.Price=Pr;
               if((ENUM_DEAL_TYPE)HistoryDealGetInteger(DealTicket,DEAL_TYPE)==DEAL_TYPE_BUY)
                 {
                  if(st.Pos>=0.0) // Увеличиваем лонг
                     st.PriceAvr=(st.PriceAvr*st.Pos+Pr*Vol)/(st.Pos+Vol);
                  else  // st.Pos<0
                    {
                     if(Vol<=-st.Pos) // Кроемся или сокращаем позу
                        Res=(-Vol)*(Pr-st.PriceAvr);
                     else if(Vol>-st.Pos) // Переворот в лонг
                       {
                        Res=st.Pos*(Pr-st.PriceAvr);
                        ClearClosedPos();
                        st.Price=Pr; st.PriceAvr=Pr;
                       }
                    }
                  st.Pos+=Vol; st.PlanPos-=Vol;
                 }
               else if((ENUM_DEAL_TYPE)HistoryDealGetInteger(DealTicket,DEAL_TYPE)==DEAL_TYPE_SELL)
                 {
                  if(st.Pos<=0.0) // Увеличиваем шорт
                     st.PriceAvr=(st.PriceAvr*(-st.Pos)+Pr*Vol)/(-st.Pos+Vol);
                  else  // st.Pos>0
                    {
                     if(Vol<=st.Pos) // Кроемся или сокращаем позу
                        Res=(Vol)*(Pr-st.PriceAvr);
                     else if(Vol>st.Pos) // Переворот в шорт
                       {
                        Res=st.Pos*(Pr-st.PriceAvr);
                        ClearClosedPos();
                        st.Price=Pr; st.PriceAvr=Pr;
                       }
                    }
                  st.Pos-=Vol; st.PlanPos+=Vol;
                 }
 
JRandomTrader #:

これは、私の古い、しかしまだ「実行可能な」コードの一部です。

О!!!こんなに早く対応していただいて、本当にありがとうございます!検討と編集のために持っていきますね。
 
Roman Shiredchenko #:
О!!!こんなに早く対応していただき、本当にありがとうございます!検討と編集に取り掛かります。

注 - "st"(トレイルや統計を含むかなり大きな構造があります)はまさにロボットの「状態」であり、変更後(およびdeinit時)ディスクにダンプされ、yinit時にロードされるものです。

しかし、このコードは5年以上前の古いもので、私の「戦闘」ロボットはすべてこのコードに結びついているので、「航空力学の第一法則 - 動作中のメカニズムに干渉しない」のです。

 

清算の結果、すべてのポジションが現在の価格、すなわちスプレッド内の平均価格に移行されます。

いい加減にしろ

 
JRandomTrader #:

注 - "st"(トレイルや統計を含むかなり大きな構造があります)はまさにロボットの「状態」であり、変更後(およびdeinit時)ディスクにダンプされ、yinit時にロードされるものです。

しかし、このコードは5年以上前のもので、私の「戦闘」ロボットはすべてこのコードに結びついているので、「航空力学の第一法則 - 動作中のメカニズムには触れない」のです。

分かりやすい説明ありがとうございます!基本的なことですが、そう思っておきます。
 
Renat Akhtyamov #:

清算の結果、すべてのポジションが現在の価格、すなわちスプレッド内の平均価格に移行されます。

いい加減にしろ

出来上がり次第、ここにファイルをアップします。
 
Renat Akhtyamov #:

清算の結果、すべてのポジションが現在の価格、すなわちスプレッド内の平均価格に移行されます。

誰が交換を気にするんだ?

私は取引所でしか取引しません。

 
JRandomTrader #:

私は証券取引所でのみ取引しています。

で、私はFXの取引しかしていません。

株取引のやり方がわからない。

I've been there, I've been there.

苦手なもの - 勉強し直す

ところで、市場の平均価格は、なぜクリア後の価格ではないのでしょうか?

// さもなくば、そこで取引することになる;)

// でも、結局のところ、彼らはグラスの中のすべてを出すのではなく、少し隠している、つまりグラスは最悪なのでは?

 
Roman Shiredchenko #:
フィックを作ったら、すぐにここに投稿します。

すべて為替取引セクションに昔から掲載されています

https://www.mql5.com/ru/forum/67298/page3#comment_2109451

ФОРТС: В помощь начинающим
ФОРТС: В помощь начинающим
  • 2015.12.08
  • www.mql5.com
Установка отложенного ордера командой OrderSend().