테스터에서 지우기 - 페이지 6

 
Roman Shiredchenko # :

과정에 있고 최선의 방법으로 해결하는 방법을 알고 있는 조직 계획 momentik이 여전히 있습니다. 코드로 단어를 작성하도록 요청합니다.

일반적으로 주문 주기를 이해하는 방법 - 이익이 새로 시작됨 - 평균 포지션 개시 가격을 고려하기 위해(해당 청산 값이 변경됨):

분명히 말해서, 나 자신과 마술사가있는 로봇을 통해 터미널에서 들어갈 수도 있습니다 ....

일반적으로 포지션 진입의 평균 가격을 계산하려면 보고 포인트가 필요합니다.

여기에서 데이터를 사용할 수 있습니다. 예를 들어 이전 위치가 이익으로 마감된 시간을 읽고 거기에서 서버의 실시간과 차이를 가져옵니다. 예를 들어 터미널에서 직접 사이클을 시작하는 경우와 같이 마술 없이:

글쎄, 다음과 같은 것:

플러스의 이전 위치와 같은 - 현재 사이클의 회계가 이미 시작되었습니다. 및 주문 - 총 포지션의 평균 진입 가격을 계산하려면 이미 진입 가격과 거래량을 모두 계산해야 합니다...

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


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

물론 이상적으로는 이전 주기의 결과와 상관없이 플러스나 마이너스로 닫히도록 해야 합니다.

예를 들어, 새로운 실제 평균 주기의 평균 가격 또는 추가 충전의 시작은 코드에서 계산을 위해 표시되었습니다. 그것은 중요하지 않습니다...

최종 포지션의 평균 가격을 계산하기 위한 기성품 구성은 없나요? 뭔가 벌써부터 세고 수정하기 지겨워요 - 돌꽃이 안나오네요.... :-)

나는 OnTrade Transaction()에서 다양한 방법을 시도했습니다. - 많은 추가 항목이 계정에 들어왔고, 결과적으로 계산 시 많은 양이 두 배로 증가했습니다. 이는 사실이 아닙니다.

이벤트

"예를 들어, 매수할 시장가 주문이 전송되면 처리되고 해당 계정에 대한 해당 매수 주문이 생성되고 해당 주문이 실행되고 미결 주문 목록에서 제거되고 주문 내역에 추가되고 해당 거래가 내역에 추가되고 새 위치가 생성됩니다. 이러한 모든 작업은 거래 거래입니다.

"

이것은 On Trade Transaction()을 통해 이루어집니다.

 //+------------------------------------------------------------------+
//| 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))
     }
  }

이 유형의 기능을 사용하면 포지션에 대한 평균 진입 가격 계산(상계 회계)의 로트가 올바르게 계산되지 않습니다.


On Trade를 통해 하는 것이 더 쉬울 수 있습니다.

여기 Trade()가 끝났습니다. 이제 모든 것이 여기에 그려져 있습니다. 계산을 코드에 삽입하기만 하면 됩니다. 그게 ... 사실입니다.

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


사실, 여기 디자인이 있습니다. 포즈가 증가하면 평균 가격을 고려하십시오. 위치를 닫을 때 모든 중간 변수는 0으로 설정됩니다. 실제로 모든 것이 기본입니다.

과제는 청산 중 포지션의 개시 가격 변동을 배제하는 것입니다(청산 시점의 심볼 가격과 같아질 때).

저것들. 코드로 계산하십시오.

Обработка торговых событий в эксперте при помощи функции 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 # :

다음은 제 오래되었지만 여전히 "전투" 코드입니다.

영형!!! ATP, 이렇게 빠른 응답을 위한 큰 - 검토 및 편집을 위해 가져갈 것입니다.
 
Roman Shiredchenko # :
영형!!! ATP, 이렇게 빠른 응답을 위한 큰 - 검토 및 편집을 위해 가져갈 것입니다.

나는 당신의 관심을 끕니다 - "st"(궤적 및 통계를 포함하여 다소 큰 구조가 있음) - 이것은 단지 로봇의 "상태"입니다. - 변경 후(및 초기화 해제 중) 디스크에 덤프되고 로드되는 것 초기화하는 동안 .

그리고 예, 여기에 st.Price 및 st.PriceAvr이 본질적으로 필요하지 않을 가능성이 높습니다. 하나면 충분하지만 코드가 오래되고 5년 이상 된 코드이며 모든 "전투" 로봇이 여기에 묶여 있으므로 "첫 번째 항공기 정비사의 규칙 - 작동 메커니즘을 만지지 마십시오."

 

청산 결과 - 모든 위치를 현재 위치로 이전합니다. 스프레드 내부의 평균 가격으로

이 교환을 누군가에게 양도하시겠습니까? ...

 
JRandomTrader # :

나는 당신의 관심을 끕니다 - "st"(궤적 및 통계를 포함하여 다소 큰 구조가 있음) - 이것은 단지 로봇의 "상태"입니다. - 변경 후(및 초기화 해제 중) 디스크에 덤프되고 로드되는 것 초기화하는 동안 .

그리고 예, 여기에 st.Price 및 st.PriceAvr이 본질적으로 필요하지 않을 가능성이 높습니다. 하나면 충분하지만 코드가 오래되고 5년 이상 된 코드이며 모든 "전투" 로봇이 여기에 묶여 있으므로 "첫 번째 항공기 정비사의 규칙 - 작동 메커니즘을 만지지 마십시오."

설명을 위해 ATP, 기본 실행에 사용하겠습니다.
 
Renat Akhtyamov # :

청산 결과 - 모든 위치를 현재 위치로 이전합니다. 스프레드 내부의 평균 가격으로

이 교환을 누군가에게 양도하시겠습니까? ...

완료되면 여기에 게시하겠습니다.
 
Renat Akhtyamov # :

청산 결과 - 모든 위치를 현재 위치로 이전합니다. 스프레드 내부의 평균 가격으로

이 교환을 누군가에게 양도하시겠습니까? ...

저는 거래소에서만 거래합니다.

 
JRandomTrader # :

저는 거래소에서만 거래합니다.

그리고 나는 외환에만있어

거래할줄 몰라요

거기에 갔다, 거기에 열

내 것이 아닙니다 - 다시 공부하십시오

그런데 왜 DOM당 평균 가격이 청산 후와 같지 않습니까?

// 그렇지 않으면 그곳에서 거래할 것입니다;)

// 그러나 유리로가는 길에 모든 것이 주어지는 것은 아니며 약간 숨깁니다. 똥 한 잔?

 
Roman Shiredchenko # :
완료되면 여기에 게시하겠습니다.

모든 것은 "거래소 거래" 섹션에 오래전에 게시되었습니다.

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

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