[ARCHIVE!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 4. - 페이지 491

 

이 기능을 되돌릴 수 있도록 도와주세요.

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

   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
      po= MarketInfo ( OrderSymbol (), MODE_POINT);
       if ( OrderType ()==OP_BUY) {
         if ( OrderStopLoss ()- OrderOpenPrice ()<LevelWLoss*po) {
          pp= MarketInfo ( OrderSymbol (), MODE_BID);
           if (pp- OrderOpenPrice ()>LevelProfit*po) {
            ModifyOrder(- 1 , OrderOpenPrice ()+LevelWLoss*po, - 1 );
          }
        }
      }
       if ( OrderType ()==OP_SELL) {
         if ( OrderStopLoss ()== 0 || OrderOpenPrice ()- OrderStopLoss ()<LevelWLoss*po) {
          pp= MarketInfo ( OrderSymbol (), MODE_ASK);
           if ( OrderOpenPrice ()-pp>LevelProfit*po) {
            ModifyOrder(- 1 , OrderOpenPrice ()-LevelWLoss*po, - 1 );
          }
        }
      }
    }
  }
}

즉, 가격이 LevelProfit 포인트 수만큼 미결 주문에서 손실되면(LevelLoss라고 부를 수 있음) 테이크프로핏을 0 또는 1포인트 2 손실 등으로 이전해야 합니다. LevelWLoss 매개변수에 무엇을 넣을지, 가격이 역전되면 이익이 없을 것입니다. 아니면 누군가 준비되어 있습니까?

미리 감사드립니다))

 

안녕하세요! 알다시피, 나는 어드바이저의 초기화 섹션에서 코드를 잘라 냈습니다. (나는 주말 동안이 방법으로 디버깅했습니다. 틱이 없습니다!), 시작 부분으로 옮겼습니다. 외부 전주기를 제거했습니다. 컴파일됨.

꾸지람-- '계속' - '중단' 또는 '계속'은 일부 주기 내에서만 사용됨 C:\Alpari\experts\Weekend.mq4 (69, 20)

그것은 무엇에 관한 것입니까? 음, 연속 주기에서, 주기에서, 그래서 어떻게 될까요? 나는 영어를 잘 못해요.. 내가 어떤 단어를 이해한다면, 나는 의미를 더하지 않을 것입니다!

 if (strela1 < strela2)
    { Sleep ( 600 );
         if (SELL > 0 ) udalenie (OP_SELL); Sleep ( 600 );
         if (BUY == 0 )
        { Sleep ( 600 ); RefreshRates ();
           OrderSend ( Symbol ( ), OP_SELL, lot, NormalizeDouble (Bid, Digits ), 5 , NormalizeDouble ( Ask+ (stoplos* Point ), Digits ),   NormalizeDouble ( Ask-( takeprofit* Point ), Digits ), NULL , magicnumber, 0 , CLR_NONE ) ;            
           int Error= GetLastError (); 
           Sleep ( 600 );
     if (Error== 129 ) continue ;    }
    
    
    }
     else if (strela1 > strela2)
    { Sleep ( 600 );
         if (BUY > 0 ) udalenie (OP_BUY); Sleep ( 600 );
         if (SELL == 0 )
        { Sleep ( 600 ); RefreshRates ();
             OrderSend ( Symbol ( ), OP_BUY, lot, NormalizeDouble (Ask, Digits ), 5 , NormalizeDouble ( Bid- (stoplos* Point ), Digits ),   NormalizeDouble ( Ask+( takeprofit* Point ), Digits ), NULL , magicnumber, 0 , CLR_NONE ); 
            
           Error= GetLastError (); 
         if (Error== 129 ) continue ;  }
 
Dimka-novitsek :

안녕하세요! 알다시피, 나는 어드바이저의 초기화 섹션에서 코드를 잘라 냈습니다. (나는 주말 동안 디버깅했습니다 - 틱이 없습니다!), 시작 부분으로 옮겼습니다. 외부 전주기를 제거했습니다. 컴파일됨.

저주받은 -- '계속' - '중단' 또는 '계속'은 일부 주기 내에서만 사용됨 C:\Alpari\experts\Weekend.mq4 (69, 20)

그것은 무엇에 관한 것입니까? 음, 연속 주기에서, 주기에서, 그래서 어떻게 될까요? 나는 영어를 잘 못해요.. 내가 몇 단어를 이해한다면, 나는 의미를 더하지 않을 것입니다!

주기가 없지만 계속 문 이 있습니다(주기에서만 사용됨).
 
Lians :

이 기능을 되돌릴 수 있도록 도와주세요.

즉, 가격이 LevelProfit 포인트 수만큼 미결 주문에서 손실되면(LevelLoss라고 부를 수 있음) 테이크프로핏을 0 또는 1포인트 2 손실 등으로 이전해야 합니다. LevelWLoss 매개변수에 무엇을 넣을지, 가격이 역전되면 이익이 없을 것입니다. 아니면 누군가 준비되어 있습니까?

미리 감사드립니다))

기능은 다음과 같을 수 있습니다.

 void fMoving_TPInBU ( int fi_LevelLOSS,       // уровень Лосса в пп. (для цены) - ТОЛЬКО > 0
                     int fi_LevelBU,         // уровень БУ в пп. (для тэйкпрофита) - может быть и >= 0 и < 0
                     string fs_Symbol = "" ,   // Symbol
                     int fi_Type = - 1 ,       // Type
                     int gi_MG = - 1 )         // MagicNumber
{
     double ld_Point, ld_Price;
     int     li_Type, li_cnt, li_total = OrdersTotal ();
//----
     if (li_total == 0 ) return ;
     if (fs_Symbol == "" || fs_Symbol == "0" ) fs_Symbol = Symbol ();
     for ( int li_pos = li_total - 1 ; li_pos >= 0 ; li_pos--)
    {
         if (! OrderSelect (li_pos, SELECT_BY_POS, MODE_TRADES)) continue ;
         if ( OrderSymbol () != fs_Symbol) continue ;
         if (gi_MG > -1) if (gi_MG != OrderMagicNumber ()) continue ;
        li_Type = OrderType ();
         if (li_Type > 1 ) continue ;
         if (li_Type > -1) if (li_Type != fi_Type) continue ;
         RefreshRates ();
         if (li_Type == 0 ) {li_cnt = 1 ; ld_Price = MarketInfo (fs_Symbol, MODE_BID);}
         else {li_cnt = - 1 ; ld_Price = MarketInfo (fs_Symbol, MODE_ASK);}
        ld_Point = MarketInfo ( OrderSymbol (), MODE_POINT);
         if (li_cnt * ( OrderOpenPrice () - ld_Price) >= fi_LevelLOSS * ld_Point)
        {
             double ld_TP = NormalizeDouble ( OrderOpenPrice () + li_cnt * fi_LevelBU * ld_Point, MarketInfo (fs_Symbol, MODE_DIGITS));
             //---- Проверка на "излишнюю" модификацию
             if (ld_TP - OrderTakeProfit () != 0.0 )
            { OrderModify ( OrderTicket (), ld_Price, OrderStopLoss (), ld_TP, 0);}
        }
    }
//----
}

STOP을 수정할 때 MODE_STOPLEVEL 및 MODE_FREEZELEVEL 제한 사항을 확인하는 것을 잊지 마십시오.

 

감사해요!! 진짜 빨리 봐야겠다..

어때요? 그리고 if (BUY == 0) - 이것은 루프가 아닙니까? 이상하게도 처음에 전체 프로그램 주위에 대괄호로 묶인 가장 바깥쪽 주기만 제거했습니다. 디버깅에 필요했는데 제거했습니다.

여기, 그리고 거기에 없다면 (strela1 < strela2) 통과하면 프로그램의 논리가 위반되지 않습니다.

 
Dimka-novitsek :

감사해요!! 진짜 빨리 봐야겠다..

어때요? 그리고 if (BUY == 0) - 이것은 루프가 아닙니까? 이상하게도 처음에 전체 프로그램 주위에 대괄호로 묶인 가장 바깥쪽 주기만 제거했습니다.


아니요. 사이클이 아닙니다. 당신은 남겨야 할 것을 앗아갔습니다. 교과서 전체를 읽어라! 특히 여기: "조건문에서 복합 명령문을 사용하는 예입니다. 먼저 if(표현식) 조건문이 오고 그 다음에 복합 명령문이 나옵니다. 복합 명령문에는 실행 가능한 명령문의 목록이 포함되어 있습니다."

 
내가 읽고 있어요.
 
HELP!! 도와주세요!! 예시로 이 피규어를 첨부합니다. 나는 프로그래머가 아니라 어떻게 든이 표시기를 납땜했지만 지식과 기술이 부족하여 일주일 내내 화면에 화살표를 표시하려고했지만 아무 일도 일어나지 않았습니다. 본질을 설명하겠습니다. 거기 히스토그램의 지표 와 가격 선 사이의 불일치입니다.예를 들어 그림에서 나는 숫자 1-2-3-4로 이 장소를 표시했습니다.그 위에 우리는 기준을 보고 가격이 최저가를 업데이트했으며 마지막으로 가보면 히스토그램도 커지는데 선이 작아지는게 보이네요 이게 우리가 필요한 포인트입니다 프로그래머들중에 관심있으신분 도움좀 부탁드립니다.
파일:
tjllfe2.zip  45 kb
 

TarasBY , 설명과 기능에 감사드립니다!

내 컬렉션에 기능을 사용하지만 뭔가 명확하지 않습니다.

fi_LevelBU 매개변수가 마이너스이면 테이크가 손실로 바뀌지만 플러스가 있으면 이익으로, 아니면 그 반대인가요?

그리고 두 번째: 함수 자체의 제한 사항을 확인하는 것이 더 나은가요, 아니면 함수 외부에서 수행하는 것이 더 나은가요?

 
Lians :

TarasBY , 설명과 기능에 감사드립니다!

내 컬렉션에 기능을 사용하지만 뭔가 명확하지 않습니다.

fi_LevelBU 매개변수가 마이너스인 경우 테이크 테이크가 손실로 전환되지만 플러스인 경우 이익으로 또는 그 반대의 경우도 마찬가지입니까?

맞습니다(반대 아님).

리안 :

그리고 두 번째: 함수 자체의 제한 사항을 확인하는 것이 더 나은가요, 아니면 함수 외부에서 수행하는 것이 더 나은가요?

모두가 스스로 결정합니다. 나는 거래 주문의 실행을 책임지고 모든 제한 사항에 대한 확인을 제어하는 라이브러리 를 만들었습니다.

PS 기능 코드(추가 괄호)에 작은 오류가 있어 수정했습니다.