KimIV의 유용한 기능 - 페이지 118

 
borilunad :
이것은 결과적인 오류와 함께 다른 함수에 대한 많은 불필요한 호출입니다.

글쎄요, 당신은 이미 실수를 저질렀습니다...

모든 것이 간단하고 명확합니다. 필요에 따라 직접 편집하십시오.

 
KimIV :


이것 과 유추하여 무언가를 묘사 할 수 있습니다 ...

업데이트...

ExistOPNearPrice() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다.

그랬는데 맞는지 모르겠네요.

 //+----------------------------------------------------------------------------+
//|  Описание : Возвращает флаг существования позиции или ордера в заданном    | 
//|           : диапазоне от заданной цены                                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    op - торговая операция               (    -1      - любая операция)     |
//|    mn - MagicNumber                     (    -1      - любой магик)        |
//|    price - заданная цена                (    -1 - текущая цена рынка       |  
//|    ds - расстояние в пунктах от цены    (  1000000   - по умолчанию)       |
//+----------------------------------------------------------------------------+
bool ExistOPNearMarkets( string sy= "" , int op=- 1 , int mn=- 1 , double price = - 1 , int ds= 1000000 ) {
   int i, k= OrdersTotal (), ot;

   if (sy== "" || sy== "0" ) sy= Symbol ();
   double p=MarketInfo(sy, MODE_POINT);
   if (p== 0 ) if ( StringFind (sy, "JPY" )< 0 ) p= 0.00001 ; else p= 0.001 ;
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
       if (OrderSymbol()==sy) {
         if (mn< 0 || OrderMagicNumber()==mn) {
           if (op==OP_BUY && (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP)) {
             if ((price< 0 && MathAbs (MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) ||
                (price> 0 && MathAbs (price-OrderOpenPrice())<ds*p)) 
               {
                 return (True);
               }
          }
           if (op==OP_SELL && (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP)) {
             if ((price< 0 && MathAbs (OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) ||
                (price> 0 && MathAbs (OrderOpenPrice()-price)<ds*p)) 
               {
                 return (True);
               }
          }
        }
      }
    }
  }
   return (False);
}
 
artmedia70 :

글쎄요, 당신은 이미 실수를 저질렀습니다...

모든 것이 간단하고 명확합니다. 필요에 따라 직접 편집하세요.

고맙습니다! 예, 다른 방법으로 했습니다.
 
khorosh :

그랬는데 맞는지 모르겠네요.

예, 맞습니다 ... 보편적으로 밝혀진 것 같습니다)))
 

정정가격().


Expert Advisors 중 한 곳에서는 어떻게든 오류 130 "Wrong Stops" 의 수를 대폭 줄여야 했습니다. 작은 스탑 앤 테이크를 사용할 가치가 없다는 나의 주장, STOPLEVEL 이라는 무역 서버 설정에 의해 설정되는 최소값에 제한이 있다는 것은 고객을 설득하지 못했습니다. 결국, 그는 서버에 거래 요청을 보내기 전에 이 오류를 어떻게든 처리하는 것이 가능하다고 말했습니다. 오류가 없다면 어떻게 처리해야 할지 막았습니다. 그러나 생각이 뇌에 들어가 작동하기 시작하여 이 기능이 탄생했습니다.

CorrectingPrice() 함수는 서버에 거래 요청을 보내기 전, 즉 초기 데이터를 준비하는 단계에서도 STOPLEVEL 요구 사항에 따라 주문 및 포지션의 주요 가격 수준을 수정하도록 설계되었습니다.

모든 기능 매개변수는 필수이며 기본값은 없습니다. 또한 마지막 세 개의 매개변수는 참조로 전달됩니다. 즉, 함수의 결과도 포함됩니다. 이 함수는 다음 매개변수를 사용합니다.
  • sy - 거래 상품의 이름. 빈 값 "" 또는 NULL은 현재 거래 수단(기호)을 의미합니다.
  • op - 거래 작업. 유효한 값은 OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP 및 OP_SELLSTOP입니다.
  • pp - 포지션/오더 개설/설정 가격.
  • sl - 손절매 가격 수준.
  • tp - TakeProfit 가격 수준.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.07.2013                                                     |
//|  Описание : Выполняет корректирование ценовых уровней под STOPLEVEL.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование торгового инструмента                                 |
//|    op - торговая операция                                                  |
//|    pp - цена открытия/установки                                            |
//|    sl - ценовой уровень StopLoss                                           |
//|    tp - ценовой уровень TakeProfit                                         |
//+----------------------------------------------------------------------------+
void CorrectingPrice( string sy, int op, double & pp, double & sl, double & tp) {
   if (sy== "" || sy== "0" ) sy= Symbol ();
  RefreshRates();
   int     di=MarketInfo(sy, MODE_DIGITS);
   int    msl=MarketInfo(sy, MODE_STOPLEVEL);
  int    sp=MarketInfo(sy, MODE_SPREAD);
   double mp=MarketInfo(sy, MODE_POINT);
   double pa=MarketInfo(sy, MODE_ASK);
   double pb=MarketInfo(sy, MODE_BID);
   double ds= NormalizeDouble (pp-sl, di);
   double dp= NormalizeDouble (pp-tp, di);

  if (msl==0) msl=2*sp;
   switch (op) {
     case OP_BUY:
      pp=pa;
      sl=pp-ds;
      tp= NormalizeDouble (pp-dp, di);
       if (sl>pp-msl*mp) sl=pp-msl*mp;
       if (tp> 0 && tp<pp+msl*mp) tp=pp+msl*mp;
       break ;
     case OP_SELL:
      pp=pb;
      sl= NormalizeDouble (pp-ds, di);
      tp=pp-dp;
       if (sl> 0 && sl<pp+msl*mp) sl=pp+msl*mp;
       if (tp>pp-msl*mp) tp=pp-msl*mp;
       break ;
     case OP_BUYLIMIT:
       if (pp>pa-msl*mp) {
        pp=pa-msl*mp;
        sl=pp-ds;
        tp= NormalizeDouble (pp-dp, di);
      }
       if (sl>pp-msl*mp) sl=pp-msl*mp;
       if (tp> 0 && tp<pp+msl*mp) tp=pp+msl*mp;
       break ;
     case OP_BUYSTOP:
       if (pp<pa+msl*mp) {
        pp=pa+msl*mp;
         if (sl> 0 ) sl=pp-ds;
         if (tp> 0 ) tp= NormalizeDouble (pp-dp, di);
      }
       if (sl>pp-msl*mp) sl=pp-msl*mp;
       if (tp> 0 && tp<pp+msl*mp) tp=pp+msl*mp;
       break ;
     case OP_SELLLIMIT:
       if (pp<pb+msl*mp) {
        pp=pb+msl*mp;
        sl= NormalizeDouble (pp-ds, di);
        tp=pp-dp;
      }
       if (sl> 0 && sl<pp+msl*mp) sl=pp+msl*mp;
       if (tp>pp-msl*mp) tp=pp-msl*mp;
       break ;
     case OP_SELLSTOP:
       if (pp>pb-msl*mp) {
        pp=pb-msl*mp;
        sl= NormalizeDouble (pp-ds, di);
        tp=pp-dp;
      }
       if (sl> 0 && sl<pp+msl*mp) sl=pp+msl*mp;
       if (tp>pp-msl*mp) tp=pp-msl*mp;
       break ;
     default :
      Message( "CorrectingPrice(): Неизвестная торговая операция!" );
       break ;
  }
}

 
KimIV :

정정가격().


Expert Advisors 중 한 곳에서는 어떻게든 오류 130 "Wrong Stops" 의 수를 대폭 줄여야 했습니다. 작은 스탑 앤 테이크를 사용할 가치가 없다는 나의 주장, STOPLEVEL 이라는 무역 서버 설정에 의해 설정되는 최소값에 제한이 있다는 것은 고객을 설득하지 못했습니다. 결국, 그는 서버에 거래 요청을 보내기 전에 이 오류를 어떻게든 처리하는 것이 가능하다고 말했습니다. 오류가 없다면 어떻게 처리해야 할지 막았습니다. 그러나 생각이 뇌에 들어가 작동하기 시작하여 이 기능이 탄생했습니다.

CorrectingPrice() 함수는 서버에 거래 요청을 보내기 전, 즉 초기 데이터를 준비하는 단계에서도 STOPLEVEL 요구 사항에 따라 주문 및 포지션의 주요 가격 수준을 수정하도록 설계되었습니다.

모든 기능 매개변수는 필수이며 기본값은 없습니다. 또한 마지막 세 개의 매개변수는 참조로 전달됩니다. 즉, 함수의 결과도 포함됩니다. 이 함수는 다음 매개변수를 사용합니다.
  • sy - 거래 상품의 이름. 빈 값 "" 또는 NULL은 현재 거래 수단(기호)을 의미합니다.
  • op - 거래 작업. 유효한 값은 OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP 및 OP_SELLSTOP입니다.
  • pp - 포지션/오더 개설/설정 가격.
  • sl - 손절매 가격 수준.
  • tp - TakeProfit 가격 수준.

Igor, 일부 DC는 이제 값이 0인 StopLevel 대신 Spread*2를 사용합니다. 코드를 훑어본 결과 이 상황에 대한 확인 사항을 찾지 못했습니다. 이러한 상황을 확인하기 위해 코드를 수정하는 것이 좋을 것입니다. 그렇지 않으면 동일한 오류가 발생합니다 130
 
artmedia70 :
Igor, 일부 DC는 이제 값이 0인 StopLevel 대신 Spread*2를 사용합니다. 코드를 훑어본 결과 이 상황에 대한 확인 사항을 찾지 못했습니다. 이러한 상황을 확인하기 위해 코드를 수정하는 것이 좋을 것입니다. 그렇지 않으면 동일한 오류가 발생합니다 130


Artyom, 나는 그런 DC를 본 적이 없습니다 ... 개인에 몇 조각을 떨어 뜨릴 수 있습니까? 거래규칙을 읽어보니...

아니면 하기가 더 쉽습니다. 스스로에게 말해보세요. 그러한 수정안을 사용하는 것이 맞습니까?

 int    msl=MarketInfo(sy, MODE_STOPLEVEL);
int     sp=MarketInfo(sy, MODE_SPREAD);
if (msl== 0 ) msl= 2 *sp;

업데이트 : CorrectingPrice() 함수를 수정했습니다.

 

새 버전의 CorrectTF() 함수.

나는 CorrectTF() 함수에 대해 그 기능이 선언된 것과 일치하지 않는다는 비판을 오랫동안 받았습니다. 그리고 실제로 시간 프레임을 가장 가까운 최소값이 아니라 가장 가까운 최소값으로 조정합니다. 표준 시간 프레임 간의 산술 평균을 계산하고 설명과 일치하도록 함수를 다시 작성했습니다.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.05.2013                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество минут).                               |
//+----------------------------------------------------------------------------+
int CorrectTF( int TimeFrame) {
   if (TimeFrame>     1 && TimeFrame<     3 ) return ( PERIOD_M1 );
   if (TimeFrame>=     3 && TimeFrame<   10 ) return ( PERIOD_M5 );
   if (TimeFrame>=   10 && TimeFrame<   23 ) return ( PERIOD_M15 );
   if (TimeFrame>=   23 && TimeFrame<   45 ) return ( PERIOD_M30 );
   if (TimeFrame>=   45 && TimeFrame<   150 ) return ( PERIOD_H1 );
   if (TimeFrame>=   150 && TimeFrame<   840 ) return ( PERIOD_H4 );
   if (TimeFrame>=   840 && TimeFrame< 5760 ) return ( PERIOD_D1 );
   if (TimeFrame>= 5760 && TimeFrame< 26640 ) return ( PERIOD_W1 );
   if (TimeFrame>= 26640                    ) return ( PERIOD_MN1 );
}
 
KimIV :


Artyom, 나는 그런 DC를 본 적이 없습니다 ... 개인에 몇 조각을 떨어 뜨릴 수 있습니까? 거래규칙을 읽어보니...

버렸어요

아니면 하기가 더 쉽습니다. 스스로에게 말해보세요. 그러한 수정안을 사용하는 것이 맞습니까?

 int    msl=MarketInfo(sy, MODE_STOPLEVEL);
int     sp=MarketInfo(sy, MODE_SPREAD);
if (msl== 0 ) msl= 2 *sp;

물론 맞습니다.

업데이트 : CorrectingPrice() 함수를 수정했습니다.

Igor, 나는 Expert Advisors에서 이것을 실제로 수행합니다. 항상 데이터를 먼저 읽고 원하는 값을 레벨 변수에 할당한 다음 계산을 확인합니다.
 
KimIV :


Artyom, 나는 그런 DC를 본 적이 없습니다 ... 개인 메시지로 몇 조각을 보낼 수 있습니까? 거래규칙을 읽어보니...

아니면 하기가 더 쉽습니다. 스스로에게 말해보세요. 그러한 수정안을 사용하는 것이 맞습니까?

업데이트 : CorrectingPrice() 함수를 수정했습니다.

안녕하세요, 동료 여러분, 제가 코드를 공부하면서 미묘한 부분을 잘 파악하지 못하고 다소 어려움이 있습니다.

내가 아는 한, 주문하기 전에 매개변수를 수정하려면 이 함수를 호출해야 합니다.

주문을 여는 라인이 있습니다:

if(구매 == true && Open[0]>UpTr && 거래) {

buy=OrderSend(Symbol(),OP_BUYSTOP,LOT(), NormalizeDouble (op,Digits),slippage,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits),"T",Magic,0,MediumBlue);

이것은 항소를 해야 합니까? 그리고 그것을 올바르게 하는 방법. 아니면 이 명령에 CorrectingPrice() 함수가 필요하지 않습니까?

미리 감사드립니다.