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

 
alexpert007 >> :

그리고 여기 Igor에 대한 또 다른 질문이 있습니다.

일반적인 OrderClose - OrderSend 없이 구매 대 판매 위치를 반전하거나 그 반대로 하는 별도의 사용자 정의(또는 기타) 기능을 생성했습니까?

나는 Igor가 아니지만 뒤집기를 위한 표준 OrderCloseBy 기능이 있습니다.

 

안녕하세요! 문제 해결에 도움을 요청합니다. 나는 다음과 같이 설명하려고 노력할 것이다.

주문을 계산하는 기능이 있습니다.

int OrdersAll(int mag)
{
정수 수 = 0;
(int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber() == mag )
콜보++;
}
}
리턴(콜보);
}

또한 작업 과정에서 현재에 대한 단일 주문이 없는 경우. 악기, 조건이 충족되면 1개의 주문을 해야 합니다. 예를 들어 구매하려면 다음과 같이 작성됩니다.

if (OrdersAll(MAGICNO)==0)
{
if(조건)
{
op=Ask;if(SL>0){sl=Ask-SL*Point*mn;}if(TP>0){tp=Ask+TP*Point*mn;}
err=OrderSend(Symbol(),OP_BUY,LotsOptimized(),NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),
NormalizeDouble(tp,자리수),"",MAGICNO,0,Blue);
if(오류<0)
{
Print("OrderSend()- 오류 OP_BUY. 주문이 승인되지 않았습니다 . op "+op+" sl "+sl+" tp "+tp+" "+GetLastError());return(-1);
}
}
}

대신, 예를 들어 터미널에서 여러 도구를 열고 각각에서 고문을 실행할 때 위의 코드는 하나의 주문을 열 수 있습니다. 이것은 정확하지만 동시에 해마가 끝날 때까지 20-30개의 주문을 열 수 있습니다. , 상태가 몇 틱 지속되는 경우. 이것은 아직 하나의 도구에서 발견되지 않았지만 하나의 도구에서도 발생하지 않을 것이라고 확신하지 못합니다. 두 개 이상의 주문을 열 수 없도록 코드를 수정하려면 어떻게 해야 합니까?

 

이고르, 좋은 저녁

나는 당신의 함수를 호출하는 것을 처리할 수 없습니다:

//+----------------------------------------------- ------------------------------+
//| 저자 : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------- ------------------------------+
//| 버전: 2008년 2월 19일 |
//| 설명: 예치 통화로 열린 포지션의 총 이익을 반환합니다. |
//+----------------------------------------------- ------------------------------+
//| 옵션: |
//| sy - 기기 이름("" - 모든 기호, |
//| NULL - 현재 문자) |
//| op - 연산(-1 - 임의의 위치) |
//| mn - MagicNumber(-1 - 모든 마법) |
//+----------------------------------------------- ------------------------------+
이중 GetProfitOpenPosInCurrency(문자열 sy="", int op=-1, int mn=-1) {
이중 p=0;
정수 i, k=OrdersTotal();

if (sy=="0") sy=Symbol();
(i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
반환(p);
}

전화 TotOrdProf=GetProfitOpenBuyPosInCurrency(EURUSD, ____, 1);

1. EURUSD를 가정하고 "EURUSD"로 인용하거나 제외해야 합니다.

2. 매수 및 싯의 총 이익을 계산하기 위해 두 번째 호출 매개변수(여기서 는 대시)는 무엇이어야 합니까(기본값 -1 시도, 정확하지 않음)

3. 세 번째 매개변수는 전문가의 매직 넘버인가? - 아직 도달하지 못했는데, 매개변수를 제대로 이해했는지의 문제일 뿐입니다.

고맙습니다.

 

TotOrdProf=GetProfitOpenBuyPosInCurrency("EURUSD",-1, -1);

- EURUSD만 해당

- 모든 오픈 포지션 (-1)

- 모든 마법이 있는 위치(-1)

 

안녕하세요.

아시다시피 Sleep() 함수는 터미널 테스터에서 작동하지 않으므로 실행을 지연하려면 수학 함수의 주기를 사용해야 합니다.

 if ( IsTesting ( ) = = true ) { for ( int z0 = 1 ; z0 < zFILE * 10000 ; z0 + + ) { MathSqrt ( MathPow ( 5 , 5 ) ) ; MathSqrt ( MathPow ( 5 , 5 ) ) ; MathSqrt ( MathPow ( 5 , 5 ) ) ; } }

여기서 zFILE - 전문가 실행 지연.

질문: 몇 초에서 10-20분(외부 프로그램에 의한 데이터 처리)까지 지연이 필요하기 때문에 더 우아한 솔루션(지연 기능)이 있습니까?

또는 적어도 기능 실행 시간을 보다 정확하게 측정하고(프로세서의 속도는 사람마다 다르기 때문에) 가장 제동이 걸리는 것을 선택하는 방법은 무엇입니까?

 
Piboli >> :

질문: 몇 초에서 10-20분(외부 프로그램에 의한 데이터 처리)까지 지연이 필요하기 때문에 더 우아한 솔루션(지연 기능)이 있습니까?

콜백과 싱크로나이저를 사용해 보셨습니까?

 

김의 기능

흥미롭게도 마지막으로 던져진 템플릿의 이름을 추출할 수 있는 기능이 있습니다.

구성 요소의 변경 사항 수정


 

KimIV 수 있고 지표를 작성할 수 있습니다

표시기는 지정된 시간 동안 플랫 채널을 찾아야 하며 설정에 지정된 것보다 넓지 않아야 합니다.

이 채널 표시기는 isTradeTimeInt() 함수에서와 같이 낮 동안과 다음 날로의 전환 모두를 검색해야 합니다.
이 표시기는 하루에 5개 채널 또는 하나만 그릴 수 있습니다.
설정이 되어있다

extern double 최대 채널 높이(포인트)
extern int Bar_Time 막대(1) 또는 시간 및 분(2) 단위의 시간 간격을 보호하는 방법
extern string 최소 채널 시간 간격(시간 및 분)
extern int 최소 채널 시간 간격(bar)
extern int 그린 상태로 남아 있는 그린 채널의 최대 수

비슷한 지표 https://www.mql5.com/en/code 를 첨부했지만 엄격하게 지정된 기간 동안 채널을 그리고 그러한 채널 자체를 검색하지 않습니다. 최대 채널 높이를 초과하지 않고 최소 채널 시간 간격 이상 지속되는 채널 자체를 검색해야 합니다.
시간으로 Bar_Time을 선택하면 채널(1)은 현재 시간에서 설정에 지정된 시간, 즉 2시간 15분 또는 다른 지정된 시간을 뺀 값에서 보호됩니다.채널의 최대 높이는 최대 두 줄을 그리고 최소 길이는 23:00~02:15입니다. Fibo 수준도 채널 위와 아래에 그려집니다.

막대 수만큼 Bar_Time을 선택하면 현재 막대에서 설정에 지정된 막대 수를 뺀 값, 즉 0 막대에서 0 막대에서 설정에 지정된 숫자를 뺀 값으로 채널이 조정됩니다. 주어진 숫자가 50이면 이제 0 막대에서 시작하여 마지막 50개 막대의 최대값과 최소값을 찾고 최대값에서 최소값을 뺀 값이 채널의 최대 높이를 초과하지 않으면 두 개의 선을 그립니다. , 길이가 50bar인 최대값 및 최소값 Fibo 수준도 채널 위와 아래에 그려집니다.

모든 채널 레벨과 데이터는 버퍼에 저장됩니다.

 

이고르에게 질문

가능하다면 각 계정의 상태를 폴링하고(로트 크기를 계산하기 위해) 두 개의 별도 계정(매도 판매)에서 작업하는 전문가 고문 코드의 특정 부분과 계정에서 계정으로 저장소를 이전하는 기능도 있습니다. 특정 조건에서 예금의 일부를 인출하기 위한 시뮬레이터로(예: 월별 또는 분기별 이익 - n%)

질문을 명확히 하고 있습니다

1 EA는 구매를 위해 작동합니다(계정 상태 2 투표) .. 6200

EA 2는 Sell에서 작동합니다(계정 상태 1 폴링) .. 8400

열린 포즈가 없는 경우

계정 2에서 계정 1로 1100

계정 1 - 7300

계정 2 - 7300

총 예치금 SD=14600 최대 위험 - 10% 최대 로트 0.14

더 나아가

01.04.09 SD=10000 기준

01.07.09 SD=14600 기준

이익=4600

10% = 460

460 세 번째 계좌로 출금

감사해요

 

친애하는 이고르! 도와주세요!

포함된 a-SimpleTrailing.mqh .

표시된 내용을 추가했지만 3개의 오류가 나타납니다 .

'clModifyBuy' - 변수가 정의되지 않았습니다.
'clModifySell' - 정의되지 않은 변수
'ti' - 이미 정의된 변수

무엇을 할까요?(



포함된 내용은 다음과 같습니다.

.........................
   total = OrdersTotal ( ) ;
   if ( total < 1 )
     {
      if ( AccountFreeMargin ( ) < ( 1000 * Lots ) )
        {
         Print ( "У вас нет денег. Свободные средства = " , AccountFreeMargin ( ) ) ;
         return ( 0 ) ;
        }
      if ( Hour ( ) > = 0 )
        {
         chk = 1 ;
         Print ( "Позиция возможна!" ) ;
        }
      if ( chk = = 1 )
        {
         if ( ( Low [ 0 ] < = MaDert1sell ) | | ( Low [ 0 ] < = MaDert2sell ) )
           {
int ti = OpenPosition ( NULL , OP_BUY , 0.1 ) ;
if ( OrderSelect ( ti , SELECT_BY_TICKET ) )
ModifyOrder ( - 1 , Ask - 30 * Point , Bid - 99 * Point , clModifySell ) ;
            if ( ticket > 0 )
              {
               if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) )
                  Print ( "Открыт ордер SELL : " , OrderOpenPrice ( ) ) ;
               chk = 0 ;
              }
            else
              {
               Print ( "Ошибка открытия SELL ордера : " , GetLastError ( ) ) ;
               return ( 0 ) ;
              }
           }
         if ( ( High [ 0 ] > = MaDert1buy ) | | ( High [ 0 ] > = MaDert2buy ) )
           {
int ti = OpenPosition ( NULL , OP_BUY , 0.1 ) ;
if ( OrderSelect ( ti , SELECT_BY_TICKET ) )
ModifyOrder ( - 1 , Ask - 30 * Point , Bid - 99 * Point , clModifyBuy ) ;
            if ( ticket > 0 )
              {
               if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) )
                  Print ( "Открыт ордер BUY : " , OrderOpenPrice ( ) ) ;
               chk = 0 ;
              }
            else
              {
               Print ( "Ошибка открытия BUY ордера : " , GetLastError ( ) ) ;
               return ( 0 ) ;
              }
           }
        }
      return ( 0 ) ;
     }
   for ( cnt = 0 ; cnt < total ; cnt + + )
     {
      OrderSelect ( cnt , SELECT_BY_POS , MODE_TRADES ) ;
      if ( OrderType ( ) < = OP_SELL & &   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol ( ) = = Symbol ( ) )  // инструмент совпадает?
        {
         if ( OrderType ( ) = = OP_BUY )   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if ( Hour ( ) = = 23 )
              {
               chk = 0 ;
               OrderClose ( OrderTicket ( ) , OrderLots ( ) , Bid , 3 , Violet ) ; // закрываем позицию
               return ( 0 ) ; // выходим
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if ( Hour ( ) = = 23 )
              {
               chk = 0 ;
               OrderClose ( OrderTicket ( ) , OrderLots ( ) , Ask , 3 , Violet ) ; // закрываем позицию
               return ( 0 ) ; // выходим
              }

           }
        }
     }
   return ( 0 ) ;
  }

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder ( double pp = - 1 , double sl = 0 , double tp = 0 , color cl = CLR_NONE ) {
  bool   fm ;
  double op , pa , pb , os , ot ;
  int    dg = MarketInfo ( OrderSymbol ( ) , MODE_DIGITS ) , er , it ;
 
  if ( pp < = 0 ) pp = OrderOpenPrice ( ) ;
  if ( sl < 0 ) sl = OrderStopLoss ( ) ;
  if ( tp < 0 ) tp = OrderTakeProfit ( ) ;
  
  pp = NormalizeDouble ( pp , dg ) ;
  sl = NormalizeDouble ( sl , dg ) ;
  tp = NormalizeDouble ( tp , dg ) ;
  op = NormalizeDouble ( OrderOpenPrice ( ) , dg ) ;
  os = NormalizeDouble ( OrderStopLoss ( )  , dg ) ;
  ot = NormalizeDouble ( OrderTakeProfit ( ) , dg ) ;
 
  if ( pp ! = op | | sl ! = os | | tp ! = ot ) {
    for ( it = 1 ; it < = NumberOfTry ; it + + ) {
      if ( ! IsTesting ( ) & & ( ! IsExpertEnabled ( ) | | IsStopped ( ) ) ) break ;
      while ( ! IsTradeAllowed ( ) ) Sleep ( 5000 ) ;
      RefreshRates ( ) ;
      fm = OrderModify ( OrderTicket ( ) , pp , sl , tp , 0 , cl ) ;
      if ( fm ) {
        if ( UseSound ) PlaySound ( NameFileSound ) ; break ;
      } else {
        er = GetLastError ( ) ;
        pa = MarketInfo ( OrderSymbol ( ) , MODE_ASK ) ;
        pb = MarketInfo ( OrderSymbol ( ) , MODE_BID ) ;
        Print ( "Error(" , er , ") modifying order: " , ErrorDescription ( er ) , ", try " , it ) ;
        Print ( "Ask=" , pa , "  Bid=" , pb , "  sy=" , OrderSymbol ( ) ,
              "  op=" + GetNameOP ( OrderType ( ) ) , "  pp=" , pp , "  sl=" , sl , "  tp=" , tp ) ;
        Sleep ( 1000 * 10 ) ;
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP ( int op ) {
	switch ( op ) {
		case OP_BUY      : return ( "Buy" ) ;
		case OP_SELL     : return ( "Sell" ) ;
		case OP_BUYLIMIT : return ( "Buy Limit" ) ;
		case OP_SELLLIMIT : return ( "Sell Limit" ) ;
		case OP_BUYSTOP  : return ( "Buy Stop" ) ;
		case OP_SELLSTOP : return ( "Sell Stop" ) ;
		default          : return ( "Unknown Operation" ) ;
	}
}
//+----------------------------------------------------------------------------+