전략이 필요한 사람은 누구입니까? 많은 무료 - 페이지 57

 
Miroslav_Popov >> :

또는 백분율로 감소를 추가하여 더 명확하게 할 수 있습니다. 고맙습니다.

 

이것은 FSB-MQL4 변환기의 시작일 수 있습니다.

도움이나 피드백을 주시면 감사하겠습니다.


 //+------------------------------------------------------------------+
//|                   FSB__Bar_Opening - Bar_Closing.mq4 v0.0.1 Beta |
//|                                 Copyright © 2009, Miroslav Popov |
//|                                              http://forexsb.com/ |
//|                                                                  |
//| An exmple EA pattern:                                            |
//| * Enter the market at Bar Opening                                |
//| * Exit the market at Bar Closing                                 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Miroslav Popov"
#property link       "http://forexsb.com/"

// The time span before bar closing time in seconds.
// It determines the time interval for position closing.
extern double ClosingTimeSpan = 10 ;


int start ( )
{
   // Check if there are open positions from the previous bar
   int iOrders = OrdersTotal ( ) ;
   if ( iOrders > 0 )
      ClosePositionsAtBarClosing ( true , true , ClosingTimeSpan ) ;
 
 
   
   // Opening Logic Conditions
   bool bLongEntryAllowed   = false ;
   bool bShortEntryAllowed = false ;

   // Put the entry logic rules here ...
   
   if ( iMA ( NULL , 0 , 13 , 0 , MODE_SMA , PRICE_CLOSE , 1 ) >
       iMA ( NULL , 0 , 13 , 0 , MODE_SMA , PRICE_CLOSE , 2 ) )
      bLongEntryAllowed = true ;
   else
      bShortEntryAllowed = true ;


   // Entry at Bar Opening
   iOrders = OrdersTotal ( ) ;
   if ( iOrders = = 0 )
   {
       if ( bLongEntryAllowed | | bShortEntryAllowed )
         OpenPositionAtBarOpening ( bLongEntryAllowed , bShortEntryAllowed ) ;
         
      iOrders = OrdersTotal ( ) ;
       if ( iOrders > 0 )
         return ( 0 ) ;
   }



   // Exit Logic Conditions
   bool bCloseLong   = true ;
   bool bCloseShort = true ;

   // Put the exit logic rules here ...
   
   // Exit
   if ( bCloseLong | | bCloseShort )
      ClosePositionsAtBarClosing ( bCloseLong , bCloseShort , ClosingTimeSpan ) ;
}

// Entry at a Bar Opening price.
//
// MetaTrader does not provide an onBarOpen event so we check the current tick volume.
// We open a position when the current tick volume is equal to 1.
void OpenPositionAtBarOpening ( bool bLongEntryAllowed , bool bShortEntryAllowed )
{
   if ( ! bLongEntryAllowed & & ! bShortEntryAllowed )
   { // An entry is not allowed.
       return ( 0 ) ;
   } 
   
   // Check for Bar Opening
   if ( iVolume ( NULL , 0 , 0 ) > 1 )
   {    // This is not the first tick.
       return ( 0 ) ;
   } 
   
   int iLots = 1 ;

   // Check the free margin.
   if ( AccountFreeMargin ( ) < ( 1000 * iLots ) )
   {
       Print ( "We do not have money enough! Free Margin = " , AccountFreeMargin ( ) ) ;
       return ( 0 ) ;   
   }
      
   int ticket = 0 ;
   if ( bLongEntryAllowed )
   {
      ticket = OrderSend ( Symbol ( ) , OP_BUY , iLots , Ask , 3 , 0 , 0 , "Bar Opening" , 0 , 0 , Green ) ;
   }
   if ( bShortEntryAllowed )
   {
      ticket = OrderSend ( Symbol ( ) , OP_SELL , iLots , Bid , 3 , 0 , 0 , "Bar Opening" , 0 , 0 , Red ) ;
   }
   
   if ( ticket > 0 )
   {
       if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) )
         Print ( "Position opened at: " , OrderOpenPrice ( ) ) ;
   }
   else 
   {
       Print ( "Error opening a position: " , GetLastError ( ) ) ;
   }
      
   return ( 0 ) ;
}


// Exit at a Bar Closing price (almost).
//
// MetaTrader does not provide an onBarClose event so we are not able to close a position
// exactly at Bar Closing. We workaround the problem by closing the position within a time span
// near to the bar closing time. In the cases when there is no any ticks within this period,
// we close the position att he next bar opening price.
void ClosePositionsAtBarClosing ( bool bCloseLong , bool bCloseShort , datetime dtClosingTimeSpan )
{
   int   iOrders = OrdersTotal ( ) ;
   bool bIsOpen = false ;

   for ( int iOrder = 0 ; iOrder < iOrders ; iOrder + + )
   {
       OrderSelect ( iOrder , SELECT_BY_POS , MODE_TRADES ) ;
      
       if ( ( OrderType ( ) = = OP_BUY | | OrderType ( ) = = OP_SELL ) & & OrderSymbol ( ) = = Symbol ( ) )
       {    // There is an open position for this symbol.

         datetime dtOpeningTime     = iTime ( NULL , 0 , 0 ) - TimeSeconds ( iTime ( NULL , 0 , 0 ) ) ; // The opening time of current bar
         datetime dtClosingTime     = dtOpeningTime + Period ( ) * 60 ;                        // The closing time of current bars
         datetime dtCurrentTickTime = TimeCurrent ( ) ;                                      // The time of current tick
         
         if (
            dtCurrentTickTime > dtClosingTime - dtClosingTimeSpan | | // The current tick is within the closing time span.
             iVolume ( NULL , 0 , 0 ) = = 1                                  // or this is the first tick of next bar
             )
         {
             if ( OrderType ( ) = = OP_BUY & & bCloseLong )
             {    // Close a long position
               bIsOpen = OrderClose ( OrderTicket ( ) , OrderLots ( ) , Bid , 3 , Violet ) ;
               
               if ( bIsOpen )
                   Print ( "Long position closed at: " , OrderClosePrice ( ) ) ;
               else
                   Print ( "Error closing a position: " , GetLastError ( ) ) ;
             }
             else if ( OrderType ( ) = = OP_SELL & & bCloseShort )
             {    // Close a short position
               bIsOpen = OrderClose ( OrderTicket ( ) , OrderLots ( ) , Ask , 3 , Violet ) ;
               
               if ( bIsOpen )
                   Print ( "Short position closed at: " , OrderClosePrice ( ) ) ;
               else
                   Print ( "Error closing a position: " , GetLastError ( ) ) ;
             }
         }
       }
   }
   
   return ( 0 ) ;
}
 

FSB가 전략을 사용하여 dll을 생성하고 함수가 다음과 같이 보일 수 있다면 나쁘지 않을 것입니다.

 #define inp   100
//---

#import "FSB.dll"
int     bEntryAllowed ( double close [ inp ] , double open [ inp ] , double high [ inp ] , double low [ inp ] , volume [ inp ] ) ;
#import


즉, dll에 여러 막대를 보내고 전략에서 응답을 받았습니다.


이 같은 dll 자체

#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
//----
#define MT4_EXPFUNC __declspec(dllexport)
#define inp 100
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
BOOL APIENTRY DllMain ( HANDLE hModule , DWORD ul_reason_for_call , LPVOID lpReserved )
   {
//----
   switch ( ul_reason_for_call )
     {
       case DLL_PROCESS_ATTACH :
       case DLL_THREAD_ATTACH :
       case DLL_THREAD_DETACH :
       case DLL_PROCESS_DETACH :
         break ;
     }
//----
   return ( TRUE ) ;
   }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall int     bEntryAllowed ( double close [ inp ] , double open [ inp ] , double high [ inp ] , double low [ inp ] , volume [ inp ] )

   {
   int out ;

   //--- strategy

   if ( close [ 1 ] > close [ 0 ] ) out = 1 ;
   if ( close [ 1 ] < close [ 0 ] ) out = - 1 ;

   return ( out ) ;
   }
결국, 당신은 여전히 모든 자체 지표를 가지고 있으며 시계열 데이터 만 필요합니다.
 

완전한 FSB <-> MT4 브리지는 나중에 제공하겠습니다.

따라서 FSB는 MT에서 견적 및 계정 정보 를 받아 거래 주문을 되돌려 보냅니다. 그런 식으로 MT에서 FSB 전략을 거래할 수 있습니다.


이제 Interop 없이 EA로 MT의 FSB 전략에 맞는 몇 가지 기본 EA 프레임워크를 만들려고 합니다.


다음과 같은 몇 가지 간단한 패턴이 필요합니다.


* 다음과 같은 경우 막대 열림(또는 표시기 값)에 입력(추가, 감소, 닫기):

- 조건1 == 참; 그리고

- 조건2 == 참; 그리고

- 조건3 == 참; 그리고

- 조건4 == 참

* 다음과 같은 경우 Bar Closing에서 나가십시오.

- 조건1 == 참; 또는

- 조건2 == 참;

또는

* 표시값에서 종료합니다.

또는

* 영구 정지 손실 출구

또는

* 입장 규칙에 따라 역순으로 진행합니다.


대부분의 지표는 표준이고 다른 지표는 매우 간단하며 MQL4에서 쉽게 다시 작성할 수 있습니다. 기본 EA 패턴이 있으면 지표를 번역하는 데 문제가 없습니다.


제가 지금 테스트하고 있는 것들은 다음과 같습니다.

"바 열림"에서 포지션을 열고 "바 닫힘"에서 닫습니다.


그래서 저는 두 가지 새로운 제품을 개발하기를 희망합니다.

1. FSB - MT 데이터 피드 및 실행 브리지

2. MQL4로 전략 내보내기


아마도 두 프로그램 모두 오픈 소스가 될 것입니다.

 

(아, 화제에서 이미 꽤 잠잠한 줄 알았는데... 되살아나자 :) ?! (많이 쓰겠습니다...논리적으로 노력하겠습니다;;), 과부하가 걸리지 않도록 여러개의 메시지로 나누어서 작성하겠습니다)


주님 - 환영합니다!


Miroslav - 먼저 "날씨에 대해"(서정적 부분) 몇 단어 ... (나는 마지막으로 영어로 내 생각을 표현할 위험이 있기 때문에 러시아어에 대한 이해가 최고가되기를 진심으로 바랍니다.)) .


제품은 절대적으로 훌륭합니다! 저는 전직 프로그래머이자 (추상 소프트웨어의) 추상 사용자로서의 경험을 바탕으로 말합니다. (모든 것이 매우 신중하게 이루어지기 때문에) 그것에 대한 사랑을 느끼고 "예기치 않게" 프로그램 개발이 멈추지 않을 것이라는 희망이 있습니다(죽지 않을 것입니다). 예, 논리적 오류가 있을 가능성이 큽니다(예: Data Horizon 사용). 인터페이스에 사소한 결함이 있습니다. 하지만 일반적으로 - 이것은 노래입니다! 바로 노래입니다!!!


또 하나의 단서가 되는 사실로 대중의 주의를 환기시켜 주시기 바랍니다. 문제/단점/새로운 기회 등을 비판하는 태도와 토론 스타일 이것은 대체 제품의 개발이 시작된 주제의 시작과 SSB의 작성자가 자신에게 전달된 의견에 어떻게 반응했는지에 대한 맥락에서입니다. 나는 Miroslav가 무료 프로그램을 개발할 "차"의 시간도 가지고 있다고 생각하지 않습니다(그리고 그는 그 자체로 그런 프로그래머라고 생각합니다). 그러나 그는 당신과 나를 위한 시간을 찾고(토론하기 위해), 우리의 의견과 요청에 따라 제품을 다듬고, 오류를 수정하고, 새로운 것을 제안합니다(최근 게시물 참조). 그리고 위의 SSB의 경우와 같이 모든 것이 히스테리없이 침착하고 측정됩니다. 그것은 (추가) 존경받을 가치가 있습니다. 안부, 미로슬라프...


서정적 부분 마무리(추상적으로 지금은) - 개인적으로 "임의의 가격 움직임" 이론의 지지자입니다. 즉, 이 문제에서 나는 시장에서 일하고 있다고 확신하는 특정 집단의 사람들(http://www.bigmany.ru와 같은 사이트 제작자 포함)의 관점을 완전히 공유합니다. Forex와 "그 옆에 있는 모든 것"에 대해 이야기함) 시장 자체의 두 가지 주요 지표 중 두 번째 지표를 찾을 수 있는 방법이 없습니다(볼륨(볼륨)에 대해 이야기하고 있음) - 단순히 쓸모없고 무의미합니다. (합리적인 의미 없이) 모든 기술 정보와 기본 분석에 의존하는 것...


이것에 대해서는 전혀 끝낼 수 있습니다 :) 하지만 아시다시피 러시아는 바보와 도로로 유명하며 이 진술의 첫 번째 요점을 사용합니다. 수백만" :D, 그러나 사실 - 나는 단지 흥미로웠습니다. "분석가의 의견"을 듣는 것이 흥미 롭습니다 (점성가와 같은 점성술사 - "전문가가 많이 있습니다", 의미가 거의 없음). 차트를 보는 것만으로도 흥미 롭습니다 (동의해야합니다-매력적입니다), 흥미롭습니다 코드를 찔러보기 그것이 내가 여기 있는 이유입니다(시장에서, 조건부로). 그리고 나 자신뿐만 아니라 대중에게도 도움이 되기를 바랍니다. Miroslav와 마찬가지로 그는 인생에서 특정 이타주의자이기 때문입니다.


나의 현재 의견은 현재 전 세계에서 사용되는 기술 분석 시스템(그리고 대다수)이 실제로 시장에 영향을 미친다는 것입니다. 저것들. 모니터를보고 지표 값에 따라 방향을 잡는 사람들의 군중은 만장일치로 특정 방향으로의 움직임을 기대하고 거래를 만들고 .. 바로이 가격을 움직입니다. 항상 그런 것은 아니더라도 소규모로 하자(결국 TA에 대해 신경 쓰지 않는 "공장, 신문, 증기선"의 소유자는 어느 시점에서 특정 금액을 사고 팔 필요가 있습니다. 시간, 아무데도 가지 마세요). 그러나 그것은 일어나고 있습니다! 즉, "알고 있는"(동일한 TA) 시장에서 긍정적인 무작위 움직임의 확률을 (약간?) 50% 이상으로 이동하려고 시도할 수 있습니다. 쉽지는 않지만... 가능합니다! 내가 확신하는 한. 이 가정에 실망하자마자 나는 시장을 떠날 것입니다 ... (그리고 그것은 이익 / 손실의 양이 아닐 것입니다. 그것은 단지, 음, 정말로, 완전히 무작위 시스템에서 일하는 것은 모욕적이고 무의미합니다. ... 일반적으로 위 참조)

 

자, 이제 요점으로.

1. 잠잠한 사이에 나는 생각했다. 예, Miroslav를 기다릴 수 있습니다(그가 MT와 FSB 사이의 다리를 만들거나 심지어 전략 컴파일러를 만들 때). 그러나 결국 - 결과는 적어도 스스로 무언가를하는 사람이받습니다. :). 나는 지금(이미 보장된) 이 도구(FSB)가 있고, MT가 있습니다. 예를 들어, 이 두 엔티티 외에는 아무것도 없을 것입니다. 그런 다음 우리는 프레임워크 내에서 작동합니다. 즉, FSB(현재 ) 폐쇄 시스템; 어쨌든 우리와 거래는 MT가 될 것입니다. 모든 시나리오에서 고문 (거래 로봇)의 코드가 필요합니다. 예, 지표의 값이 (대략) 미끄러지는 일종의 보편적 템플릿이 있어야하며 그게 전부입니다. "승인된 계획"; 대응 지표가 필요합니다.


2. 바로 EA 코드에 집중하겠습니다. 그래서 나는 단순한 Expert Advisors 제작자의 낙관론을 공유하지 않습니다. 글쎄, 터미널과 시장이 작동하는 동안 비정상적인 상황의 수를 상상하는 것은 불가능합니다. 그러나 우리는 돈에 대해 이야기하고 있으며 농담은 여기에 적합하지 않습니다 (오류 코드를 확인하지 않았습니다. 그들은 일종의 기본 조치를 계산했습니다 ... 그리고 항해 - 마치 일어나지 않은 것처럼 $ 1000). 저것들. 나는 정말로 돈으로 운영하는(또는 더 나은 - 실제 돈으로 운영하는) 전문가는 외부 이벤트에 대한 반응 측면에서 "강화 콘크리트"여야 한다고 확신합니다. 코드는 터미널, 서버의 작동 또는 시장 자체의 움직임에서 최대 변형 수를 제공해야 합니다. 요컨대 - 이것은 매우 심각하며 점프(작성)로 해결되지 않습니다. 기꺼이 그러한 패턴을 만드는 데 참여할 준비가 되었습니다. 하지만...


3. 밑바닥부터 똑같이 하기로 했다. 현장의 생각 - 전문가를 운용할 것이 없다면(지표 자체) - 그렇다면 전문가가 필요한 이유는 무엇입니까? :)?! 그리고 지표를 채택했습니다 ...

전제는 다음과 같았다. 첫째, 실제로 FSB의 지표 값이 MT의 일반 또는 추가 지표 값과 동일하다는 것을 아무도 보장할 수 없습니다. 그리고 두 프로그램에서 "비교할 수 있는" 결과를 얻으려면 값이 일치해야 합니다. 둘째, 지표 자체(일반 지표)의 수는 여전히 다릅니다. 그리고 외부를 사용하기 위해 (그리고 찾기 위해) ... 나는 어떻게 든 일반 또는 내 자신 (인생에서)을 사랑합니다 ... (우리는 내 "특이점"을 쓸 것입니다 :)). 셋째, FSB에서 표시기 코드의 "증류"는 Miroslav가 언급한 것처럼 여전히 직접적이고 거대한 작업이 아닌 것 같습니다. 알고리즘 자체는 매우 간단하고 Miroslav의 표시기 자체는 코드 측면에서 매우 "조직적"입니다( 코드가 통합됨) , 즉 대략적으로 말하자면, 우리는 템플릿을 한 번 만들고 칠면조 코드를 하나씩 "조각"합니다(글쎄, 이것이 이상적인 태도입니다 :))). 네 번째에도 있습니다 - 나는 관심이있었습니다 :).

일반적으로 주말에 앉아서. 무엇인가를 시작하기 전에 나는 보통 "오랜 시간을 버틴다"(이 경우에는 생각한다). 템플릿 자체를 다시 실행할 시간이 많지 않습니다(이를 이해합니다). 특히 지표의 수가 특정 수치를 초과하는 경우. 따라서 요점을 즉시 설계해야 합니다. 결과적으로 다음 전제에서 진행했습니다.


- 이것은 단지 지표여야 합니다(그리고 Expert Advisor의 미래 코드에 대한 기능이 아닙니다). 여전히 정보에 대한 시각적 인식은 사람(특히 저에게)에게 중요한 역할을 하며 (나중에) 전문가 코드의 표시기를 호출하는 것은 그런 문제가 아닙니다(포럼은 이미 iCustom 에 대한 많은 사본을 깨뜨렸습니다. 의견이 너무 많아서 일반적으로 모든 것을 직접 확인하는 것을 선호합니다. "현장 테스트"의 결과가 수행되며 약간의 오버헤드가 있을 수 있지만 크지 않다 (나는 이것을 모든 책임으로 선언합니다) 그리고 접근 방식의 보편성 측면에서 무시할 수 있습니다)). 그러나 "특별한 감정가"의 경우 :) (경우에 따라) 표시기의 계산 자체가 동일한 유형의 별도 기능으로 이동됩니다(아래 참조).


- 지표는 원래 FSB와 동일한 값을 출력해야 합니다( 아래 특별 조항 ). 저것들. FSB의 코드는 기본으로 사용되며 가능한 한 적게 마무리됩니다.


- IndicatorCounted와 함께 올바르게 작동하도록 코드를 최적화해야 합니다(즉, 속도).


- 표시기의 매개변수와 해당 값은 유형이 동일하고 균일해야 합니다. 나는 데이터 유형 자체가 아닙니다. Miroslav의 표시기 코드를 보면 입력 매개변수와 출력 버퍼 모두 좋은 균일성(균일성)을 볼 수 있습니다. 작업은 사용자가 매개변수를 지정하거나 지표 값을 가져올 때 탐색하기 편리하도록 원본 그림을 보존하는 것입니다.

- 이전 단락의 결과 - ... mmm (주의 - 중요 ). 모든 지표를 사용할 때의 핵심은 지표가 일종의 고유한 가치를 생성한다는 것이 아닙니다. 이것이 그들이 낳는 것 신호 ! 글쎄, 정말로, 나에게, 사람에 관해서는 - 차이점은 무엇입니까, 지금 또는 조금 후에 (?!) 거기에있는 일부 색인의 가치는 무엇입니까? 그것은 모두 동일한 "이해할 수없는 숫자"입니다. 이것은 "구매" 또는 "판매"일 때입니다. :). 다른 모든 것 - "명확하지 않음"! Miroslav는 이 아이디어를 매우 우아하게 사용하여 각 표시기(장기 위치 및 단기 위치)에 두 개의 버퍼를 생성했으며, 표시기 자체의 사용(위치 또는 논리 조건의 포인트)에 따라 해당 버퍼를 획득합니다. 위치를 열거나 닫는 값 또는 예/아니오 필터(개방 논리에서 모두 "예"인 경우 열림, 닫는 논리에서 적어도 하나가 "아니요"인 경우 닫음(일반적으로 RTFM)). 멋진! ;) 나는 구타를 당했고 이 행동을 모방했습니다 . 현재 처음 두 개의 표시기 버퍼(값은 데이터 창에서 볼 수 있음)가 각각입니다. 필터가 있는 원하는 버퍼(1/0) 또는 가격 값이 각각 긴 쪽이나 짧은 쪽에서 포지션을 여는 데 사용됩니다. 저것들. 나중에 EA 코드에서 표시기 자체를 사용할 때 그에게 무엇-거기, 어디서-거기 및 특정 표시기를 생성하는 값은 중요하지 않습니다. 처음 두 버퍼의 값을 분석하는 것으로 충분할 것입니다 아주 간단한 주제에 대해 (예 / 아니오(조건부) 또는 거기에서 직접 가격표를 가져옴) ... 그리고 그게 다입니다! 여기에 뉘앙스가 있습니다. Ishimoku에서 거의 100% "걸릴 것"입니다(지표 자체 버퍼의 수가 거의 MT 자체의 한계 값(8)에 근접하는 경우) - 음, 생각해보자. 거부하고 싶지 않습니다. 아름다운 아이디어(처음 두 개의 버퍼 포함). 그것들을 하나로 결합하는 것은 작동하지 않을 것입니다(나는 ... 1/0(비트 마스크로 바뀔 수 있음)뿐만 아니라 가격표도 있을 수 있다고 생각했습니다). 아마도, 나는 어떻게 든 지표 값 자체를 다룰 것입니다 ... 보자 ... 길을 따라 ...

 

일반적으로 요약(추상): 품질(FSB 호환성, 버그 없는 등), 추가 사용 용이성, 속도, 코드 가독성. 이 순서로.

글쎄, 그리고 (실제로) - 무슨 일이 있었는지 ... (간단한 역사)

- 모든 표시기는 파일 이름 접두사에 "fsb" 값을 갖습니다(예: "fsbBlaBlaBla.mq4").


- 나는 의사 무작위 순서로 지표 자체를 가져 왔으므로 나를 비난하지 마십시오. 지금까지는 있습니다. 추가 논의/분석 등을 위해 - 충분하다고 생각합니다.


- Miroslav는 이동 평균과 논리 버퍼의 값을 계산하기 위해 세 가지 외부 함수(소스(페이지 맨 아래에 있음)에 있음)를 사용합니다. 나는 그들과 함께 시작해야 했다. 모든 기능은 라이브러리 기능(" fsbCommon.mqh ")으로 배열된 하나의 파일(" fsbCommon.mq4 ")에 래핑됩니다. 이 오페라의 또 다른 파일(" fsbConstants.mq4 ")이 있습니다. 이 파일에는 각각 코드의 편의를 위한 상수가 포함되어 있습니다. 기능 자체에는 특별한 문제가 없었습니다(저는 "논리 발진기"의 초기 논리를 다소 복잡하게 하여 추가 검사(범위를 벗어난 배열, 올바른 초기 값 보장(역사상 최초))(Miroslav, 이 주제에 대한 코드의 논리적 오류).. .. 그리고 함수가 이 매개변수의 정상적인 값에 대해 결과 버퍼의 값을 올바르게 채울 수 있도록 MovingAverage에서 iShift의 동작을 "에뮬레이트"하기 위해 오랫동안 시도했습니다. (그리고 원래의 원본 코드에 주어진 제한 사항뿐만 아니라) ... 결과적으로 지금은 이 문제를 포기하고 시작 부분에 "stub"을 넣습니다("0"이 아닌 iShift를 사용하면 함수는 아직 작업이 필요하지만 아직 필요하지 않음)).MovingAverage는 성가신 것으로 판명되었지만 하나의 돌로 여러 새를 죽입니다.함수에서 버퍼를 MT의 값으로 반환하므로 불가능합니다(예, 아마도 필요하지 않을 수도 있음) - 끝에 추가 매개 변수가 나타남( afTarget ) 또한 IndicatorCounted ()를 고려하여 한 단계 더 매개변수는 처리를 위한 첫 번째 막대의 값을 담당합니다. 글쎄, 마지막 추가 매개 변수는 MT 측면에서 "가격 상수"를 설정합니다. 이 값은 MovingAverage 자체의 값이 기존 시리즈 배열을 기반으로 계산되거나 (값이 iAppliedPrice "가격 상수"MT의 값 외부) - 기반 에프소스 . (따라서 코드의 오버로드) 프로그래밍의 뉘앙스를 즉시 지정하겠습니다. 선택 항목이 있는 경우 사이클이 산재되어 있는 경우 사이클이 선택 항목 내부에 삽입되고 (일반적으로 더 논리적임) 그 반대의 경우도 마찬가지입니다. 제대로 하는 방법을 몰라서가 아니라 얼마나 빨리 하는지 알기 때문에 하는 것입니다 :)! (미래에 코드를 분석하려는 사람이라면 누구나 이에 대해 언급하지 않겠습니다. 하지만 "코드의 어리 석음에 대해"라는 질문을 하기 전에 (잠재적으로) 이러한 문제를 일으킬 수 있는 것에 대해 조금 생각하십시오. 프로그램 작성).


또 다른 뉘앙스는 MovingAverage와 연결되어 있습니다(누군가에게 유익할 수 있음) - 왜냐하면. 지수 평활 모드(평활화 포함)의 이동 평균 값은 이전 값에 직접적으로 의존합니다. "시작점"의 선택이 매우 중요해집니다(추가 계산의 기초로 사용할 값). 일반적으로 이에 대한 몇 가지 접근 방식이 있습니다. 누군가는 이전 기간의 종가를 취합니다. 누군가가 이전 기간의 가격을 평균화했습니다. N ... Miroslav는 두 번째 방법으로갔습니다. MT가 먼저입니다. 따라서 차트 시작 부분에서 이 두 평활 모드에서 상당한 불일치가 발생했습니다(저는 MovingAverage 및 기타 모든 항목(" fsbTest.mq4 ")를 테스트하기 위해 하나의 공백을 추가했습니다)! 그리고 MovingAverage 자체의 데이터 가용성에 대한 기능 내에서 내가 부과한 제한 사항 전에 iFirstBar 또는 이와 유사한 양의 계산된 값 후에 아이퍼스트 바. 왜냐하면 지표 자체는 차트에서 막대의 최소값(현재 2000)에 대해 상수를 사용합니다. 이것은 어떤 상황에서도 충분해야 합니다(200보다 큰 기간이 있는 매개변수를 아직 본 적이 없기 때문입니다). 물론 한 번에 둘 이상의 MA가 사용되지 않는 한 ;).


- 이전 단락과 유사하게 이 프로젝트 작업에서 이미 사용하고 있는 외부 하위 기능에 대한 파일이 생성되었습니다(접두사 "st": " stCommon.mq4 ", " stCommon.mqh ", " stConstants.mq4 ").


- 글쎄, 실제로 - 지표 자체. 매우 짧은 용어로(" Bar Range "를 예로 들어 보겠습니다):

 //외부 정수 슬롯 유형 = SLOT_TYPE_LC;
외부 int indLogic = INDICATOR_RISES ;    // (INDICATOR_RISES <= indLogic <= INDICATOR_LOWER_LL)
외부 정수 nBars = 1 ;                  // 1 <= nBars <= 200
외부 정수 f레벨 = 0 ;                  // 0 <= f레벨 <= 500
외부 bool iPrvs = ;                // 허위 사실

슬롯 유형 세트 유형 슬롯 ~에 FSB(위치 또는 논리 조건의 점) 용어 . 진입/종료 필터일 뿐만 아니라 시가/마감 가격을 설정할 수 있는 지표 - 이 매개변수는 지표가 로직 버퍼에서 생성할 것을 정확히 결정합니다. fsbConstants.mq4의 모든 상수 보기(모든 것이 매우 명확함)

인디 로직 - 사실, 표시기에 대한 논리적 조건(값에 따라 다른 의미론적 부하를 가짐 슬롯 유형 )

음, 매개변수는 forexsb.com의 표시기 소스에 나타나는 순서와 FSB 자체에 표시되는 방법에 따라 더 진행됩니다. 매개변수 경계는 주석에 지정되며 PCheck() 하위 함수를 호출하여 init()를 호출할 때 제어됩니다.

 이중 LPIndBuffer [];            // 롱 포지션 #1
이중 SPIndBuffer [];            // 숏 포지션 #2

이중 IndBuffer [ ];              // 인디케이터의 값 #3

이중 IndBufferDD [ ];            // 드로잉 #4를 위한 추가 버퍼
이중 IndBufferDU [ ];            // 드로잉 #5를 위한 추가 버퍼

버퍼를 사용하면 전역 수준의 모든 것이 표시기 버퍼로 사용됩니다(표시기 자체에 연결됨). 필요한 논리적 요소(LPIndBuffer[], SPIndBuffer[])(항상 항상 이 순서(#0 - 긴 위치, #1 - 짧은 위치)), IndBuffer[] - 표시기 자체의 데이터입니다. 하지만 이 경우 컬러 히스토그램을 사용하기 때문에 이 버퍼는 그 자체로 값만 전달하고, 연색을 위해 2개의 추가 버퍼를 사용합니다. 그렇지 않으면 MT 내에서 색상 히스토그램의 동작을 시뮬레이션합니다. 그것들은 어떤 식으로든 DataWindow에 표시되지 않습니다.

초기화() 모든 것이 평소와 같습니다 (매개 변수 값이 확인되고 표시기 자체 및 색인의 이름이 설정되고 버퍼가 첨부되는 등)


deinit()에서 여가 시간(아직 우선 순위가 아님)에 표시기를 닫지 않는 경우(추가적인 편의성, 매개변수가 재설정되지 않는 등) 경우에 논리를 삽입할 생각입니다.


시작() 매우 원시적입니다. 그 임무는 차트에 충분한 막대가 있는지 확인하고(모든 MA를 계산하고 일반적으로) 지표 자체를 계산하는 함수를 호출하는 것입니다. 어떻게 든 특별한 방식으로 그려집니다. 이 경우 -once)


계산하다() - 실제 계산. 코드는 일반적으로 Miroslav의 코드와 유사하지만 IndicatorCounted()와 관련된 최적화를 위해 예외가 있습니다. 표시기를 계산하기 위해 추가 표시기 버퍼가 필요한 경우 함수 자체(정적) 내부에 설정되며(표시기 자체의 인덱스를 낭비하지 않도록) BufferSync() 함수에 의해 서비스됩니다. 여기에 별도의 농담이 있습니다. 처음에는 하나 이상의 상수 매개변수(iMaxBars)로 계산을 제한하려는 시도가 있었습니다. "필드 테스트"(파트 2) 역사, 부재, 미래로의 이동(따옴표의 도착, 오른쪽으로 배열의 증가(나는 이제 시각적으로, 그래픽 표현에 대해 )), ... 과거로의 이동(히스토리가 누락된 경우(차트에서 왼쪽으로 이동) 터미널이 서버에서 로드하고... 배열이 왼쪽으로 확장될 때)... 그래서. .. 헤어졌다. 확장 BufferSync()의 방향에 따라 아름답게 해 보았고 배열 resp를 확장했습니다. 왼쪽 또는 오른쪽, 빈 EMPTY_VALUE 값을 채웁니다. 여기서 MT는 일반적으로 인덱스 배열을 LEFT로 확장하지 않습니다. 그는 항상 그것들을 오른쪽으로 확장합니다([0] Bar의 측면에서). 내가 말하는 바가 명확하기를 바랍니다. 기록의 다음 점프 중에 차트의 막대 값이 iMaxBars를 초과할 때(다시 점프하여) 표시기가 값을 나타내지 않는 상황이 충분히 가능합니다. iMaxBars의 왼쪽에 있지만 여기에서 "이상한 데이터"가 있으며 iMaxBars의 왼쪽에 쉽게 있을 수 있습니다. 아마도 아무도 그들을 보지 않을 것입니다 ... 그러나 "아름답지 않은"(우리 방법이 아님). 그리고 필요한 것은 MT 자체가 올바른 방향으로 빈 값으로 버퍼를 보완하는 것뿐입니다 ... 그러한 상황을 포착하는 것이 잠재적으로 가능하지만 ... 일반적으로 우리는 맨 처음부터 차트 ... _항상_. (글쎄, 이 특정 지표에 대해 가능한 한)


또 다른 뉘앙스는 IndicatorCounted()와 관련이 있습니다. 신성한 기능인 것 같습니다. 계산된 막대의 값을 반환하면 귀하에 대한 청구가 없을 것입니다... WILL BE! 나는 IndicatorCounted() 자체가 책임이 있다고 생각합니다(MQ의 프로그래머 뿐만 아니라). 이 함수의 신성한 목적에 도달하지 못한 많은 사용자 지정 표시기 프로그래머입니다. 따라서 항상 적은 수의 잠재적 값을 반환해야 합니다. 전체 차트(IndicatorCounted() == 0) 또는 첫 번째 막대((IndicatorCounted() == Bars - 1) 또는 두 개(IndicatorCounted() == Bars - 2)를 다시 계산합니다. 제 말은, 예를 들어, 연결이 끊어지고 차트가 한 막대 이상 "실행"된 경우 - 그게 전부입니다... "나무가 서 있는 상태로 죽었습니다"(IndicatorCounted() == 0) - 우리는 전체 차트를 새로운 이유에 대해 계산합니다. 건너뛴 막대의 수를 반환할 수 없었습니까(3, 4, ... 5... 10...)?(내가 이해하는 한 이 기능은 원래 의도된 것입니다.) 일반적으로 이렇습니다. ..

... RSI에서 "발견"했습니다. 그리고 모든 의미에서. 첫째, 나는 Miroslav의 코드를 이해하지 못했습니다(그에 대한 질문은 아래에 있습니다). 둘째, 지표를 테스트하는 동안 MT와 FSB 내에서 얻은 값의 불일치를 보았습니다! 아니요, 그것은 당신이 생각한 것과 전혀 다릅니다("비뚤어진 인내" - 글쎄, 인정하세요, 당신은 생각했습니다 ;)). 요점은 불행히도 다음 선언에 있는 것 같습니다.

 부동 [] afPos = 새로운 부동 [ 막대 ];
...
부동 소수점 ; _
...

간단히 말해서 - 뜨다 ! 잠시 생각하다가 일단 속도를 늦췄다. 첫 번째 논문(정확성과 품질)이 의심스러워졌습니다.


여기에서 다음과 같은 추론이 가능합니다. 한편으로는 부동액이 나쁘지 않습니다. 말하자면 지표 값의 "거칠게 하는" 것이므로 거래 전략이 시장의 무작위 스파이크에 훨씬 덜 취약해야 합니다. 반면에, 예를 들어 일부 fLevel(예: 1.0)을 교차할 때 - 0.99998과 1.00001은 두 가지 큰 차이점입니다. 그리고 그러한 불일치가 있습니다. 그리고 그런 순간에 포즈가 열리지만 실제로 FSB 수준이 여전히 1.0에 도달하지 못하고 아래로 떨어지면 누구를 탓합니까? (지표를 옮기신 분 :D?!)


실제로 두 가지 솔루션이 있습니다(float MT가 지원되지 않는다는 점을 감안할 때!).


- MT 자체에서 부동 소수점을 에뮬레이트합니다( NormalizeDouble(X, Digits + 2) 와 같은 일부 가슴 아픈 구조 포함) - 글쎄, 모든 곳이 아니라 모든 곱셈/나눗셈이


- FSB의 float를 두 배로 변경합니다. 여기서 변경 범위, 분명히 유한함을 이해해야 하지만 모든 곳을 조심스럽게 걸어야 합니다. 그리고 인간에서 생성된 전략의 잠재적인 결과는 "떠 있을 수" 있습니다. 그리고 일반적으로 Miroslav가 필요합니까? (나의 겸손한 의견은 FSB 자체가 이것을 필요로 한다는 것입니다. 왜냐하면 여분의 정밀도는 누구에게도 해를 끼치지 않았지만 계산의 속도로(이 목표가 추구된 경우(?), 더 이상 이유가 없기 때문에) 이 시간 섹션에서 현실 - 이것은 중요한 영향을 미치지 않아야 함). 이 문제에 대해서는 MQ의 의견에 동의합니다. 정수 수학(일부 10진수)으로 연산을 수행하지 않으면 최소한 가능한 최대 정확도로 시도할 것입니다. 일반적으로 다음과 같은 ... 쉬운 질문이 아닙니다 ...

 

요컨대 - 잘 시간입니다 :). 장황하게 말해서 죄송합니다(다시는 하지 않겠습니다, 요점만 말씀드리겠습니다).


의견을 듣고 싶습니다. 이 주제를 계속해야 합니까(그런 다음 나머지 지표를 삽질하여 더 "서둘렀습니다")? 나는 어떤 순서로 할 수도 있습니다 (아직 초기 혼란 스럽기 때문에 :)), 누가, 아마도 앞으로해야 할 일. 불행히도 시간은 일반적으로 부족합니다(사무실의 부국장 - "하루가 갑니다" :D). 저것들. 나는 보통 저녁에 시간을 찾습니다. 하지만 하루에 1~2개의 지표를 제공할 수 있다고 생각합니다...



글쎄, Miroslav에 대한 질문 - 주제에 ...

1. fMicron 의 가치는 무엇입니까? (나는 (반사에) 0.000001 , 그것은 보인다, 또는 더 적은 비트 깊이?)


2. bIsDescreteValues 매개변수는 무엇입니까 (논리 발진기에서). 요점은 알지만 기본값은 무엇입니까? 그리고 변화는 어떤 조건에 달려 있습니까? (또는 말하자면 - 무엇과 연결되어 있는지 (FSB 인터페이스 또는 다른 곳에서))


3. 실제로 RSI에 대해, 이것은 어떤 종류의 구성입니까?:

 ~을 위한 ( int iBar = iFirstBar ; iBar <  ; 아이바 ++)
{
afPosMA
[ 아이바 ] = ( afPosMA [ 아이바- _ 1 ] * ( iPeriod- _ 1 ) + afPos [ 아이바 ]) / iPeriod ;
afNegMA
[ 아이바 ] = ( afNegMA [ 아이바 - 1 ] * ( iPeriod- _ 1 ) + afNeg [ 아이바 ]) / iPeriod ;
}

:)? 다음 질문의 동기: 나에게 시력이 변하지 않으면 MA가 부드러워집니다. 전체 코드의 맥락에서 - 이미 계산된 MA에 적용되고 첫 번째 값만 "살아있는" 상태로 유지되는 평활 MA를 생성합니다. :) 마치 논리적인 질문처럼 - 여기서 불필요한 것은 무엇입니까? 이 구조는 무엇보다도 작동 불가 (!) 표시기 자체(항상 부드럽게 나타남) 및 이에 종속된 RSI 스무딩 모드 선택. 또는 afPos, afNeg에 대한 이전 MA 계산(매개변수의 올바른 모드 사용)?


고전적인 RSI가 평활 평균을 기반으로 구축되었다는 것은 분명합니다. 그러나 Simple MA에는 최소한 변형이 있으며 결국 위의 코드를 제거하여 maMethod 매개변수의 동작이 작동하도록 하는 것이 논리적입니다. 또는 이 주기 전에 MA 계산을 제거하고 모든 지표에서 MA RSI 매개변수를 삭제합니다(아무것도 영향을 미치지 않기 때문입니다!).


위의 코드를 제거하겠습니다. :). (변환된 지표에서 이 섹션은 원래 기능이 필요한 사람에게 주석 처리되어 있습니다. 주석 태그를 제거하십시오! RSI 코드는 검토를 위해 제공됩니다... 여기에서 결정할 때까지 저는 "위험과 위험을 감수하고" 사용하겠습니다. :))


4. 이미 말했듯이 초기 막대에서 동작할 때 논리 발진기에는 중요하지 않은 논리 오류가 있습니다. 이제 생각을 정리할 수 없어 내일(어디서, 어떻게 수정해야 하는지) 적어 둡니다.


5. FSB 에서 float 무엇을 할 것인가? (또는 MT 에서 부족 ) :)?


아카이브는 찾고 있는 파일을 포함하고 폴더로 나누어 MT 루트로 압축을 풉니다(아카이브는 다음 메시지로 이동합니다)


모두에게 행운을 빕니다 ... 쓰기 :)
 

지표의 현재 아카이브(2009-04-15)

파일:
experts.rar  101 kb
 

나는 float가 이길 수 없다는 데 동의합니다. 탈출구를 찾아야합니다. 매치를 작성해야 합니다. 그런 다음 지표 라이브러리를 만듭니다. 제가 도울 수 있다면 기쁠 것입니다.