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

 

좋은 저녁이에요! 이해하는 방법을 알려주세요

현재 미결 주문 및 미결 포지션을 제외하고 현재 계정 및 현재 시장 환경에서 지정된 주문 유형에 필요한 증거금.

기존 함수를 근사할 수 있습니까?

 

많은 대신 이 기능을 사용하기 시작했습니다.

 double      Lott  ( double      Lot ){
     if ( risk!= 0 )  Lot=AccountFreeMargin()*risk/ 10000 ; return (Lot);}  

꽤 자주 OrderSend 오류 131 - 잘못된 볼륨을 씁니다. 초기 저장소가 10,000인 경우 초기 lot은 1입니다. 그러나 무언가가 작동하지 않습니다..

 

시간이 좀 견딜 수 없는 마지막 2개 구매 위치만 닫기 위해 닫기 구매 위치 블록 을 다시 만들지만 작동하지 않습니다 . 제안할 수 있습니까? ~처럼 블록을 변경?

 void Close_2buy()
{
   bool    result;
   double   close_price;
   int     cmd,error;
   bool close;

       for ( int f= OrdersTotal ()- 1 ; f>= 0 ; f--) // 
      {
         OrderSelect (f, SELECT_BY_POS);
         if (OrderSymbol()== Symbol () &&(OrderMagicNumber()==magic ) 
         && (OrderType() == OP_BUY )) 
         {
            close = False;
            {
               close_price = MarketInfo(OrderSymbol(), MODE_BID);
               close = True;
            }
               
             if (close) 
            {
               result=OrderClose(OrderTicket(), OrderLots(), close_price, 0 , CLR_NONE );
               if (result!=TRUE)
               {error= GetLastError (); Print ( "LastError = " , error);}
            }
            
         }
      }
}
 
Dimka-novitsek :

많은 대신 이 기능을 사용하기 시작했습니다.

꽤 자주 OrderSend 오류 131 - 잘못된 볼륨을 씁니다. 초기 저장소가 10,000인 경우 초기 lot은 1입니다. 그러나 무언가가 작동하지 않습니다..


나는 이것을 사용하고 있다. 직접 조정하고 시도하십시오.(AccountBalance()를 AccountFreeMargin()으로 변경하고 변수 LotDigits를 입력하십시오)
 //+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link       ""
////////////////////////////////////////////////////////////////////////|
extern int      Method         = 1 ;       // Метод: 0-FixedLots, 1-часть //|
                                       //(Risk) от свободных средств  //|
                                       // нормированных по значению   //|
                                       // MeansStep(например Risk=    //|
                                       // 0.01,MeansStep=1000,если    //|
                                       // средств меньше 2000,лот     //|
                                       // равен 0.01,если средств     //|
                                       // стало 2000 или более - 0.02 //|
                                       // лота, 3000 или более - 0.03 //|
                                       // лота и т.д.).               //|
                                                                       //|
extern double   LOTS           = 0.01 ;   // Количество лотов при        //|
                                       // Method=0.                   //|
                                                                       //|
extern double   Risk           = 0.01 ;   // Риск. Часть от средств при  //|
                                       // FixedLot=false.             //|
                                                                       //|
extern double   MeansStep      = 100.0 ;   // Шаг средств. Используется   //|
                                       // при Method=1.               //|     
////////////////////////////////////////////////////////////////////////|
//+------------------------------------------------------------------+//|
//|  Определяем "свой" минимальный размер или шаг лота на момент     |//|
//|  начала цикла в зависимости от размера баланса и установленного  |//|
//|  риска.                                                          |//|
//+------------------------------------------------------------------+//|
////////////////////////////////////////////////////////////////////////|
double fGetLotsSimple()                                               //|
   {                                                                   //|
   double LOTSTEP,lot;                                                 //|
   double Means;                                                       //|
   switch (Method)                                                     //|
      {                                                               //|
       case 0 :                                                         //|
         lot=LOTS;                                                     //|
       break ;                                                           //|
       case 1 :                                                         //|
         Means=AccountBalance();                                       //|
         if (Means<MeansStep)Means=MeansStep;                           //|
         lot=(MeansStep* MathFloor (Means/MeansStep))/MeansStep*Risk;   //|
       break ;                                                           //|
       default :lot=LOTS;                                               //|
   }                                                                   //|
   if (lot< 1.0 / MathPow ( 10 ,LotsDigits))lot= 1.0 / MathPow ( 10 ,LotsDigits);   //|
   LOTSTEP=MarketInfo( Symbol (),MODE_LOTSTEP);                         //|
   lot= MathFloor (lot/LOTSTEP)*LOTSTEP;                                 //|
   lot= NormalizeDouble (lot,LotsDigits);                               //|
   if (lot>AccountFreeMargin())lot=- 1 ;                                 //|
   return (lot);                                                       //|
}                                                                     //|
////////////////////////////////////////////////////////////////////////|
)
 

이 코드에서 무엇이 잘못되었는지 말해 줄 수 있습니까? 이것은 후행 중지와 유사하지만 테스트할 때 수정하면 오류 1이 발생합니다. 주문이 수정되지 않는 이유는 무엇입니까?

또한이 오류를 수정했을 때 (지금까지는 성공적이지 않음) 컴파일하는 동안 Expert Advisor의 기본 코드에서 인쇄 기능으로 오류를 반환하기 시작했으며 따옴표가 충분하지 않으며 모든 것이 올바르게 설정되었다고 씁니다. 이 오류를 수정하려면 인용문을 제거하고 다시 인용해야 합니다. .

부울 후행 정지()
{
if ((OrderMagicNumber()==11111)==true)
{
Print("매수 포지션을 유지하고 있습니다.");
동안(OrderCloseTime()==0)
{
if ((Bid-OrderStopLoss())>(StopLevel*Point))
{
if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Bid-StopLevel*Point),0,0))
Print(" Stop Loss of order with number ", OrderTicket()," 및 매직 넘버 ",OrderMagicNumber(),", ",OrderStopLoss())로 성공적으로 변경됨
else Print("번호가 ",OrderTicket(),"이고 매직 번호가 ",OrderMagicNumber(),"인 주문의 손절매 수준을 이동하지 못했습니다. 오류 ",GetLastError());
}
}
if (OrderCloseTime()>0)
{
Print("주문 번호 ", OrderTicket()," 및 매직 번호 ",OrderMagicNumber(),", 가격으로 마감됨 ",OrderClosePrice(),", 손익 포함 ",OrderProfit());
반환(참);
}
}
또 다른
{
if ((OrderMagicNumber()==22222)==true)
{
Print("매도 포지션 유지");
동안(OrderCloseTime()==0)
{
if ((OrderStopLoss()-Ask)>(StopLevel*Point))
{
if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Ask+StopLevel*Point),0,0))
Print("Stop Loss of order with number ",OrderTicket()," 및 매직 넘버 ",OrderMagicNumber(),", ",OrderStopLoss())로 성공적으로 변경되었습니다.
else Print("번호가 ",OrderTicket(),"이고 매직 번호가 ",OrderMagicNumber(),"인 주문의 손절매 수준을 이동하지 못했습니다. 오류 ",GetLastError());
}
}
if (OrderCloseTime()>0)
{
Print("주문 번호 ", OrderTicket()," 및 매직 번호 ",OrderMagicNumber(),", 가격으로 마감됨 ",OrderClosePrice(),", 손익 포함 ",OrderProfit());
반환(참);
}
}
그렇지 않으면 반환(거짓);
}
}
 
감사해요!!
 
Ekburg :

이 코드에서 무엇이 잘못되었는지 말해 줄 수 있습니까? 이것은 후행 중지와 유사하지만 테스트할 때 수정하면 오류 1이 발생합니다. 주문이 수정되지 않는 이유는 무엇입니까?

또한이 오류를 수정했을 때 (지금까지는 성공적이지 않음) 컴파일하는 동안 Expert Advisor의 기본 코드에서 인쇄 기능으로 오류를 반환하기 시작했으며 따옴표가 충분하지 않으며 모든 것이 올바르게 설정되었다고 씁니다. 이 오류를 수정하려면 인용문을 제거하고 다시 인용해야 합니다. .

부울 trailingstop()
{
if ((OrderMagicNumber()==11111)==true)
{
Print("매수 포지션을 유지하고 있습니다.");
동안(OrderCloseTime()==0)
{
if ((Bid-OrderStopLoss())>(StopLevel*Point))
{
if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Bid-StopLevel*Point),0,0))
Print("Stop Loss of order with number ",OrderTicket()," 및 매직 넘버 ",OrderMagicNumber(),", ",OrderStopLoss())로 성공적으로 변경되었습니다.
else Print("번호가 ",OrderTicket(),"이고 매직 번호가 ",OrderMagicNumber(),"인 주문의 손절매 수준을 이동하지 못했습니다. 오류 ",GetLastError());
}
}
if (OrderCloseTime()>0)
{
Print("주문 번호 ", OrderTicket()," 및 매직 번호 ",OrderMagicNumber(),", 가격으로 마감됨 ",OrderClosePrice(),", 손익 포함 ",OrderProfit());
반환(참);
}
}
또 다른
{
if ((OrderMagicNumber()==22222)==true)
{
Print("매도 포지션 유지");
동안(OrderCloseTime()==0)
{
if ((OrderStopLoss()-Ask)>(StopLevel*Point))
{
if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Ask+StopLevel*Point),0,0))
Print("Stop Loss of order with number ",OrderTicket()," 및 매직 넘버 ",OrderMagicNumber(),", ",OrderStopLoss())로 성공적으로 변경되었습니다.
else Print("번호가 ",OrderTicket(),"이고 매직 번호가 ",OrderMagicNumber(),"인 주문의 손절매 수준을 이동하지 못했습니다. 오류 ",GetLastError());
}
}
if (OrderCloseTime()>0)
{
Print("주문 번호 ", OrderTicket()," 및 매직 번호 ",OrderMagicNumber(),", 가격으로 마감됨 ",OrderClosePrice(),", 손익 포함 ",OrderProfit());
반환(참);
}
}
그렇지 않으면 반환(거짓);
}
}


오류 1은 버그가 아닙니다. 이는 주문이 이미 수정되었음을 의미합니다. OrderModify() 전에 수정 매개변수를 삽입하십시오( 주문 손절매가 stoploss와 같지 않으면 (ND(Bid-StopLevel*Point) 또는 ND(Ask+StopLevel*Point) ) , OrderModify() , 그렇지 않으면 -- 반환).
 
rigonich :

오류 1은 버그가 아닙니다. 이는 주문이 이미 수정되었음을 의미합니다. OrderModify() 전에 수정 매개변수를 삽입하십시오(주문 손절매가 stoploss와 같지 않으면 (ND(Bid-StopLevel*Point) 또는 ND(Ask+StopLevel*Point) ) , OrderModify() , 그렇지 않으면 -- 반환).


따라서 이 수표는 더 높습니다: if ((Bid-OrderStopLoss())>(StopLevel*Point)), 또는 내가 당신을 잘못 이해했습니다

내가 날카로운 움직임으로 테스트 한 것에서 시각적으로도 중지 명령과 표현이 동일하지 않다는 것을 분명히 볼 수 있습니다.

 
Usual_Trader :


Offhand, 내가 보는 것은 주문 마감 기능에서 티켓 OrderSelect(Ticket, SELECT_BY_TICKET) 로 주문을 선택해야 하고 Lts 변수에 없는 로트 수를 지정해야 한다는 것입니다. 왜냐하면 매번 다시 계산되지만 OrderLots를 사용하기 때문입니다. () 그리고 한 가지 더 - 각각 0번째 막대에서 계속 작업하면 한 막대의 기준이 사라질 수 있고 원하는 위치에서 주문이 열리지 않을 수 있습니다. 표시기 매개변수에서 막대 0에서 1, 1에서 2로 변경



답변 주셔서 감사합니다. 하지만 여기에서 기준이 다시 제대로 작동하지 않습니다. 화면에서 볼 수 있습니다(주문( )는 확률론의 모든 교차점에 대해 작동하지 않으며 여전히 0 bar에서 작업하고 싶습니다. , 그러나 이것을 위해서는 내가 이해하는 것처럼 추가 조건이 필요합니다. 조건: 현재 막대에서 주문을 연 후 막대가 닫힐 때까지 아무 것도 하지 않지만 구현 방법을 모르겠습니다(아마도 시계열 배열을 통해 ??? ) 말해 주세요.
파일:
 
Ekburg :


따라서 이 수표는 더 높습니다: if ((Bid-OrderStopLoss())>(StopLevel*Point)), 또는 내가 당신을 잘못 이해했습니다

내가 날카로운 움직임으로 테스트 한 것에서 시각적으로도 중지 명령과 표현이 동일하지 않다는 것을 분명히 볼 수 있습니다.


문제는 다음과 같습니다. 이 함수에 OrderSelect()가 없기 때문에 주문 루프의 어딘가에서 사용되는 것 같습니다. 이 주기가 0차부터 마지막 1차까지 검색을 구성하는 경우 첫 번째 주문을 수정한 후 또는 예를 들어 이 틱에서 주문이 마감된 경우 다음에 OrderSelect() 함수가 호출될 때 주문 주문이 변경되고 기능은 이미 수정된 주문을 수정하도록 선택할 수 있습니다. 따라서 주문 의 손절매 값이 OrderModify() 함수에 전달한 값과 동일한지 확인해야 합니다.

 if (ND(Bid-StopLevel* Point )==OrderStopLoss()) return ( true );