초보자의 질문 MQL4 MT4 MetaTrader 4 - 페이지 18

 
Babu Bonappan :

그러나 MarketInfo ( OrderSymbol (), MODE_MARGINREQUIRED )* Lot 구성을 사용하여 주문을 여는 순간 마진의 정확한 값을 얻으면 어떻게 됩니까? 항상 소수점 이하 두 자리가 포함됩니다. 그런 다음 100을 곱하여 이 주문의 MagicNumber로 저장합니다. 그리고 필요한 경우 거기에서 가져 와서 100.0으로 나눕니다.

맞을까?

각 주문에 고유한 마법을 할당하시겠습니까?
 
Babu Bonappan :

내가 이해하는 OrderOpenPrice는 내가 필요한 것을 정확히 제공합니다. 그러나 예금 통화 가 달러이고 거래 쌍이 EUR/USD인 경우에만 가능합니다. 이 경우 OrderOpenPrice에서는 주문 개시 시점의 예금 통화에 대한 기준 통화의 환율이 유지되어 어느 것을 알면 쉽게 마진을 계산할 수 있습니다.

그러나 이러한 조건 중 하나 이상이 충족되지 않으면 단일 주문에 대한 마진 금액을 얻는 방법은 무엇입니까? 개통 당시의 예치통화 대비 호가의 기준통화 환율은 어디서 알 수 있나요?

예, 우리는 초 단위까지 정확한 주문 개시 시간을 가지고 있습니다. 그러나 우리는 무엇을 얻을 수 있습니까? 최대 - 원하는 악기의 분 촛불 매개 변수. 그러나 마진이 계산된 비율의 정확한 값은 아닙니다. 그러나 AccountMargin 함수는 어떻게 든 그것을 얻습니다! 정확히 어떻게 이해하고 싶습니다.

OrderOpenPrice - 주문 개시 가격, 그것은 (가격) 한 통화와 다른 통화의 비율입니다.

AccountMargin - 모든 미결 주문에 대한 총 계정 마진을 제공합니다.

 
Vladimir Karputov :

움직이는:

바실리 다닐로프 , 2016.12.02 07:18

제가 이해할 수 없다고 말해주세요. 외부 지표에 대한 간단한 Expert Advisor를 거의 작성 했지만 한 가지 걸림돌이있었습니다.

로트의 절반을 닫는 것이 올바르게 작동하지 않으며 각 틱에 대해 순서가 수정됩니다.

다음은 구매 수정 블록입니다.

if (CountBuy()>0) //이 함수는 구매 주문 수를 계산합니다.
{ for (int i = OrdersTotal() -1; i>=0; i--)
{ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{ if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //가격이 지표에서 필요한 이동을 통과한 경우
SL=NormalizeDouble(Ask-(MinMove*10)*포인트, 자릿수); //여기서 스톱을 손익분기점으로 변경합니다.
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //로트의 절반을 마감하려고 합니다.
Print("구매 로트의 절반을 마감하는 동안 오류가 발생했습니다.");
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //나머지는 여기서 손익분기점으로 재정렬
Print("매수할 손익분기점 수정 오류");

} } }


매 틱마다 주문이 수정되지 않도록 if (SL != OrderStopLoss ()) modify .... 와 같은 것을 확인할 수 있습니다. 그러면 SL 값이 현재 OrderStopLoss와 다른 경우에만 수정됩니다.

닫을 때 무엇이 잘못되었는지 이해하기 위해 GetLastError () 요청을 넣으십시오. 그러나 일반적으로 OrderClose ... bool testOrCls를 확인하는 것이 좋습니다.

testOrCls=주문 마감 ......

if(! testOrCls) 인쇄( GetLastError () );

저것들. 오류가 있으면 오류 코드를 요청하고 오류가 없으면 오류 코드를 요청하지 않습니다.


 
bablusut :

답변 감사합니다 ... 인터넷의 바닥을 삽질했습니다. StringFind 기능을 사용하는 예는 거의 없습니다. 내가 찾은 것에서 매개 변수는 다음과 같아야한다고 결론지었습니다.

int 문자열 찾기 (

       코멘트 = 주문 코멘트 ()   // 찾고자 하는 문자열
       OrderStopLoss , OrderTakeProfit // 우리가 찾고 있는 것
    정수        start_pos=0     // 검색을 시작할 위치에서

);

...제가 틀렸다면 고쳐주세요...

조금 그런 식으로 작동하지 않습니다. 이 함수에 대한 인수로 지정됨 1) 검색할 문자열. 2) 찾을 문자의 조합; 3) 검색 시작(기본값 - 항목 1에 따른 문자열의 null 문자부터).

검색된 하위 문자열이 시작되는 문자열의 위치 번호를 반환하거나 하위 문자열을 찾을 수 없는 경우 -1을 반환합니다.

즉, 다음과 같이 작성해야 합니다.

if ( StringFind ( OrderComment (), "[tp]" , 0 )>- 1 ) {действие при нахождении признака закрытия по TP}
 
Renat Akhtyamov :

로트의 절반을 닫는 실수로 충돌하므로 수정되지 않습니다. 위의 내 게시물에 따라 수정하십시오.

그리고 이것을 한 번 하려면 손익분기점을 고정된 포인트 수로 설정하고 이 숫자가 일치하는지 여부에 대해 주문의 이익실현을 확인하는 조건을 추가해야 합니다.

그리고 주문 수정 블록에서 이러한 조건을 통과할 때 반을 닫는다.

바실리 다닐로프 :
제가 이해할 수 없다고 말해주세요. 외부 지표에 대한 간단한 Expert Advisor를 거의 작성 했지만 한 가지 걸림돌이있었습니다.

블록에 OrederClose가 있으면 로트의 절반이 즉시 닫히고 OrderModify가 더 이상 작동하지 않습니다.

OrederClose를 제거하면 OrderModify는 각 틱의 순서를 수정합니다.

다음은 구매 수정 블록입니다.

   if (CountBuy()> 0 ) //В этой функции считается кол-во ордеров на покупку
   { for ( int i = OrdersTotal () - 1 ; i>= 0 ; i--)
     { if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {   if ( OrderMagicNumber ()==Magic && OrderType ()== OP_BUY && ( Ask - OrderOpenPrice ())* 10000 >MinMove) //Если цена прошла необходимое движение из индикатора
      SL= NormalizeDouble ( Ask -(MinMove* 10 )* Point , Digits ); //Тут меняю стоп на безубыток
       if (! OrderClose (Ticket,Lots/ 2 , Ask ,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print ( "Ошибка закрытия половины лота на покупку" );
       if (! OrderModify (Ticket, OrderOpenPrice (),SL,TP, 0 )) //Тут переставляю оставшуюся часть в безубыток
       Print ( "Ошибка модификации в безубыток на покупку" );

   }    }   }
가격이 MinMove에 전달되면 주문의 절반이 마감되고 후반이 한 번 손익분기점에 도달하도록 하는 방법은 무엇입니까?

그건 그렇고, 이제 SELECT_BY_POS 위치로 OrderSelect를 발견했지만 티켓 선택은 어디에 있습니까?

OrderClose(주문 티켓()

 
Babu Bonappan :

MQL4를 사용하여 터미널에서 각 오픈 포지션에 대한 마진을 얻는 방법을 알려주십시오.

나는 보통 이렇게 했다:

margin = MarketInfo ( Symbol (), MODE_LOTSIZE ) * OrderOpenPrice () / AccountLeverage () * OrderLots ();

EUR/USD를 거래할 때 이 구성은 완벽하게 작동했으며 논리가 정확하다고 확신했습니다.

하지만 이제 EUR/JPY(또는 EUR/CHF)에 대해 동일한 결과를 얻고 싶습니다. 분명히 OrderOpenPrice () 대신에 표준 랏의 크기에 기본 통화와 예금 통화 의 비율을 곱해야 합니다(제 경우에는 EUR/USD). 근데 이게 무슨 코스야? 포지션을 열었을 때 있었던 것입니까, 아니면 지금 있는 것 (이 포지션의 마진 금액을 알고 싶은 순간)?

MODE_MARGINMAINTENANCE 아니요?

 
A1exPit :

그건 그렇고, 이제 SELECT_BY_POS 위치로 OrderSelect를 발견했지만 티켓 선택은 어디에 있습니까?

OrderClose(주문 티켓()

이 스레드에 대해 정말 아무것도 모르십니까?

주문이 선택되면 OrderTicket()은 선택한 주문 의 티켓을 반환합니다. 인덱스 또는 티켓으로 주문을 선택하는 방법은 중요하지 않습니다.

티켓으로 선택할 때 뉘앙스가 있습니다. 은 고려되지 않으며 어떤 목록에서 주문이 선택되었는지 확인하고 마감 시간을 확인해야 합니다.

 
Vasiliy Danilov :
제가 이해할 수 없다고 말해주세요. 외부 지표에 대한 간단한 Expert Advisor를 거의 작성 했지만 한 가지 걸림돌이있었습니다.

블록에 OrederClose가 있으면 로트의 절반이 즉시 닫히고 OrderModify가 더 이상 작동하지 않습니다.

OrederClose를 제거하면 OrderModify는 각 틱의 순서를 수정합니다.

다음은 구매 수정 블록입니다.

   if (CountBuy()> 0 ) //В этой функции считается кол-во ордеров на покупку
   { for ( int i = OrdersTotal () - 1 ; i>= 0 ; i--)
     { if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {   if ( OrderMagicNumber ()==Magic && OrderType ()== OP_BUY && ( Ask - OrderOpenPrice ())* 10000 >MinMove) //Если цена прошла необходимое движение из индикатора
      SL= NormalizeDouble ( Ask -(MinMove* 10 )* Point , Digits ); //Тут меняю стоп на безубыток
       if (! OrderClose (Ticket,Lots/ 2 , Ask ,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print ( "Ошибка закрытия половины лота на покупку" );
       if (! OrderModify (Ticket, OrderOpenPrice (),SL,TP, 0 )) //Тут переставляю оставшуюся часть в безубыток
       Print ( "Ошибка модификации в безубыток на покупку" );

   }    }   }
가격이 MinMove에 전달되면 주문의 절반이 마감되고 후반이 한 번 손익분기점에 도달하도록 하는 방법은 무엇입니까?

부분 폐쇄로 티켓이 변경됩니다. 먼저 손익분기점을 넘은 다음 마감합니다.

또는 논리를 변경하십시오.

 
Artyom Trishkin :

A1엑스핏 :

그건 그렇고, 이제 SELECT_BY_POS 위치로 OrderSelect를 발견했지만 티켓 선택은 어디에 있습니까?

OrderClose(주문 티켓()

이 스레드에 대해 정말 아무것도 모르십니까?

주문이 선택되면 OrderTicket()은 선택한 주문 의 티켓을 반환합니다. 인덱스 또는 티켓으로 주문을 선택하는 방법은 중요하지 않습니다.

티켓으로 선택할 때 뉘앙스가 있습니다. 은 고려되지 않으며 어떤 목록에서 주문이 선택되었는지 확인하고 마감 시간을 확인해야 합니다.

그리고 이 주석이 작성된 코드를 보면? 너무 명확하지 않습니다 ...

{ if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {   if ( OrderMagicNumber ()==Magic && OrderType ()== OP_BUY && ( Ask - OrderOpenPrice ())* 10000 >MinMove) //Если цена прошла необходимое движение из индикатора
      SL= NormalizeDouble ( Ask -(MinMove* 10 )* Point , Digits ); //Тут меняю стоп на безубыток
       if (! OrderClose ( Ticket ,Lots/ 2 , Ask ,Slippage,Black)) //Пытаюсь закрыть половину лота Какой тикет?
 
Vitalie Postolache :

그리고 이 주석이 작성된 코드를 보면? 너무 명확하지 않습니다 ...

{ if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {   if ( OrderMagicNumber ()==Magic && OrderType ()== OP_BUY && ( Ask - OrderOpenPrice ())* 10000 >MinMove) //Если цена прошла необходимое движение из индикатора
      SL= NormalizeDouble ( Ask -(MinMove* 10 )* Point , Digits ); //Тут меняю стоп на безубыток
       if (! OrderClose ( Ticket ,Lots/ 2 , Ask ,Slippage,Black)) //Пытаюсь закрыть половину лота Какой тикет?
음... 네... 자세히 보지는 않았습니다. 네 ... 조금. 나는 어떤 이유로 이 스레드에 관심이 없습니다.