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

 

컴뱃 17.07.2009 22:13

요약하면, 우리는 매수 3 랏의 합을 구하고 이 매도 3 랏의 양의 카운터를 설정합니다.

...........................

옵션으로 그렇습니다. 그러나 이미 열린 판매 주문이 있는 경우 EA가 필요한 주문을 마감하지 않을 수 있습니다. 이것은 해결할 수 있지만.

컴뱃 17.07.2009 22:13

그러나 질문: 모든 포지션을 청산할 수 있습니까?

예, 스크립트를 사용하여 순차적으로 하나씩 할 수 있습니다. 빠릅니다! 그리고 모든 것...

...........................

이것이 제가 지금 사용하고 있는 것입니다. 스크립트 세트 - 이것 또는 저것 중 하나를 사용합니다... 하지만 내 전략을 Expert Advisor로 코딩하려고 시도했지만 여러 가지 어려움에 부딪쳤습니다.

 
gince >> :
여기에서 무언가가 작동하지 않는다는 것은 닫히지 않는다는 의미이며 오류가 발생하지 않습니다.

b-Positions.mqh 라이브러리의 ClosePositions() 함수에서 KimIV는 테스터에서 사용을 금지하는 다른 ClosePosBySelect() 함수에 대한 호출을 사용합니다.

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;


백테스트의 경우 그의 라이브러리 b-ForTest.mqh 를 사용하십시오.

 
BoraBo писал(а) >>

b-Positions.mqh 라이브러리의 ClosePositions() 함수에서 KimIV는 테스터에서 사용을 금지하는 다른 ClosePosBySelect() 함수에 대한 호출을 사용합니다.

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;

백테스트의 경우 그의 라이브러리 b-ForTest.mqh 를 사용하십시오.

당신은 내 코드를 잘못 이해했습니다... 러시아어로 번역 중입니다... 테스트 모드가 아니고(EA가 거래를 허용하지 않거나 Expert Advisors가 중지된 경우) 주기를 중단하십시오. 간단히 말해서 이 줄은 도구 모음의 "전문가" 버튼에서 손을 떼면 루프를 종료합니다.

 
소리는 혼란스러워졌다.
 

좋은 저녁이에요,

불행히도 배열에도 불일치가 있습니다 ... 주문을 카운팅하는 코드로 0보다 큰 조건(Lts>0)으로 로트를 하나씩 닫습니다(수익 달성 조건에 따라) , 총 이익을 고려할 필요가 있지만:

   int Tip ;                                // Тип ордера
   int Ticket = 0 ,                            // Номер ордера
   Tkt ;                                    // Количество номеров ордеров
   double Lot = 0 ,                            // Количество закр. лотов
   Lts ;                                    // Количество лотов всего
   double Price_Cls ;                        // Цена закрытия ордера
   int Errors ;
//--------------------------------------------------------------- 3 --

       for ( int mm = 1 ; mm < = Mas_Ord_Tek [ 0 ] [ 0 ] ; mm + + ) // Цикл по живым ордерам
         {
         if ( Mas_Ord_Tek [ mm ] [ 6 ] = = Tip & &      // Среди ордеров нашего типа
            Mas_Ord_Tek [ mm ] [ 5 ] > Lot & &        // .. выбираем лоты
            Mas_Ord_Tek [ mm ] [ 4 ] > Ticket )      // .. выбираем номер ордера
           {                                // Этот больше ранее найден.
            Lts = Mas_Ord_Tek [ mm ] [ 5 ] + Lot ;
            Tkt = Mas_Ord_Tek [ mm ] [ 4 ] + Ticket ;
           }
         }
       if ( Tip = = 0 ) Price_Cls = Bid ;            // Для ордеров Buy
       if ( Tip = = 1 ) Price_Cls = Ask ;            // Для ордеров Sell
       if ( BuyOrdProf > 100 & & Lts > 0 )
      Ans = OrderClose ( Tkt , Lts , Price_Cls , 0 , Red ) ; // Закрыть все ордера

그리고 주문 계산에 1개 이상의 로트(Lts>1)가 있는 경우 로트가 마감되지 않습니다.

   int Tip ;                                // Тип ордера
   int Ticket = 0 ,                            // Номер ордера
   Tkt ;                                    // Количество номеров ордеров
   double Lot = 0 ,                            // Количество закр. лотов
   Lts ;                                    // Количество лотов всего
   double Price_Cls ;                        // Цена закрытия ордера
   int Errors ;
//--------------------------------------------------------------- 3 --

       for ( int mm = 1 ; mm < = Mas_Ord_Tek [ 0 ] [ 0 ] ; mm + + ) // Цикл по живым ордерам
         {
         if ( Mas_Ord_Tek [ mm ] [ 6 ] = = Tip & &      // Среди ордеров нашего типа
            Mas_Ord_Tek [ mm ] [ 5 ] > Lot & &        // .. выбираем лоты
            Mas_Ord_Tek [ mm ] [ 4 ] > Ticket )      // .. выбираем номер ордера
           {                                // Этот больше ранее найден.
            Lts = Mas_Ord_Tek [ mm ] [ 5 ] + Lot ;
            Tkt = Mas_Ord_Tek [ mm ] [ 4 ] + Ticket ;
           }
         }
       if ( Tip = = 0 ) Price_Cls = Bid ;            // Для ордеров Buy
       if ( Tip = = 1 ) Price_Cls = Ask ;            // Для ордеров Sell
       if ( BuyOrdProf > 100 & & Lts > 1 )
      Ans = OrderClose ( Tkt , Lts , Price_Cls , 0 , Red ) ; // Закрыть все ордера

누가 오류를 보는지 알려주십시오.

아니면, Igor, 내가 당신의 기능을 잘못 이해하고 있습니까?

BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // 함수 호출

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency ( string sy = "" , int op = - 1 , int mn = - 1 ) {
   double p = 0 ;
   int     i , k = OrdersTotal ( ) ;

   if ( sy = = "0" ) sy = Symbol ( ) ;
   for ( 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 ( ) ;
           }
         }
       }
     }
   }
   return ( p ) ;
}
 

Igor, 표시기에 PriceOpenLastPos 기능을 삽입하는 방법을 알려주십시오.

컴파일할 때 편집기는 첫 번째 대괄호와 후속 변수에 대해 오류를 제공합니다.

이중 PriceOpenLastPos ( 문자열 sy="", int op=-1, int mn=-1) {
날짜 시간 t;
이중 r=0;
int k=OrdersTotal();

if (sy=="0") sy=Symbol();
(i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) {
t=주문오픈타임();
r=주문공개가격();
}
}
}
}
}
}
}
리턴(r);
}
}

'(' - 예기치 않은 함수 정의 D:\MT4\experts\indicators\Astrea.mq4 (627, 24)
'sy' - 정의되지 않은 변수 D:\MT4\experts\indicators\Astrea.mq4 (632, 7)
등.

나는 지표에서 거래 신호를 생성하는 논리를 구현하고 글로벌 변수 를 통해 EA에 주문 열기/청산을 위해 이미 형성된 신호를 보냅니다.

어떤 결정을 내리려면 주문의 개시 가격이 필요하므로 이 문제를 해결하려고 합니다. 내 표시기는 동적이며 데모에서만 또는 테스터에서 시각화 모드로 디버그할 수 있습니다.

 

전체 이익이 고려되지 않고 개별 주문의 이익이 고려되는 그림입니다.

 
Angela , 컴파일러는 여기에서 내 함수 정의를 볼 것이라고 기대하지 않았습니다. 이것은 코드의 상위 어딘가에 무언가가 없다는 것을 의미합니다. 세미콜론이나 닫는 중괄호일 수 있습니다. 일반적으로 코드를 주의 깊게 확인하십시오.
 
hope писал(а) >>
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // 함수 호출

함수에 잘못된 매개변수가 전달되었습니다. 다음과 같아야 합니다.

BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);
 
KimIV >> :

함수에 잘못된 매개변수가 전달되었습니다. 다음과 같아야 합니다.

함수 호출에서 기호에 앵커를 추가해도 도움이 되지 않습니다. 그는 왜 각 포지션에 대한 이익을 별도로 계산합니까(위 그림)?