초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 120

 

             int digits = ( int ) SymbolInfoInteger ( _Symbol , SYMBOL_DIGITS );       // number of decimal places
             double point = SymbolInfoDouble ( _Symbol , SYMBOL_POINT );             // point
             double ask = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );                 // current price for closing SHORT
             double SL = ask-_SL*point;                                         // unnormalized SL value
            SL = NormalizeDouble (SL,digits);                                   // normalizing Stop Loss
             double    TP = ask+_TP*point;                                       // unnormalized TP value
            TP = NormalizeDouble (TP,digits);                                   // normalizing Take Profit
             double    open_price = SymbolInfoDouble ( _Symbol , SYMBOL_BID );

             if (!trade.Buy(Volume, _Symbol ,open_price,SL,TP, "" ))
               {
                   //--- failure message
                   Print ( "Sell() method failed. Return code=" ,trade.ResultRetcode(),
                   ". Code description: " ,trade.ResultRetcodeDescription());
                   return ( false );             
               }
             else
               {
                   Print ( "Sell() method executed successfully. Return code=" ,trade.ResultRetcode(),
                   " (" ,trade.ResultRetcodeDescription(), ")" );
               }

내가 왜 전략 테스터 에 손절매와 이익을 넣지 않고 시장 가격으로만 포지션을 오픈하는지 알려주시겠습니까?

열려면 CTrade(trade.Buy)를 사용합니다.

나는 (trade.PositionOpen) 을 사용하여 열려고 시도했는데, 데모에서는 열리고 중지가 되지만 테스터에서는 중지가 0이고 무엇이 문제일 수 있는지 이해가 되지 않습니다.

 
안녕하세요 친애하는 프로그래머입니다. 저에게 프로그래머는 신과 같습니다. 무에서, 허공에서, 작동하는 것, 심지어 물질적인 것까지 만드는 것은 정말 환상적입니다... 시간에 대한 기사를 읽었습니다. 그러나 주기성 설정에 대해서는 언급하지 않았으며 심지어 주기성도 언급하지 않았지만 한 명의 고문에 대해 적절한 시간에 켜고 끄기를 전환했습니다. 아마도 누군가가 이 주제를 물었을 것입니다. 지금은 각각의 시간에 시작하고 꺼지도록 어드바이저의 이름을 바꿔야 하지만 MT5에는 한 쌍의 어드바이저만 있으므로 핸들을 전환해야 합니다. 그리고 그것은 타임 그리드와 같은 것으로 밝혀졌을 것입니다 ... 감사합니다
 
Top2n :

당신이 수동으로 할 수 있다는 것은 분명합니다. 로봇이 전시되어야합니다.

주문 수정 기능을 만드는 방법은 무엇입니까?

https://www.mql5.com/ru/articles/134
Как создать свой Trailing Stop
Как создать свой Trailing Stop
  • 2010.08.05
  • Dmitry Fedoseev
  • www.mql5.com
Основное правило трейдера - дай прибыли расти, обрезай убытки! В статье рассматривается один из основных технических приемов, позволяющий следовать этому правилу - перемещение уровня защитной остановки (уровня Stoploss) вслед за растущей прибылью позиции, другими словами - скользящий стоп или трейлинг стоп (trailingstop). Приводится пошаговая процедура создания класса для трейлинг стопа на индикаторах SAR и NRTR, который каждый желающий сможет за 5 минут встроить в своего эксперта или использовать независимо для управления позициями на своем счете.
 
후행 나는 적시에 켜고 끄는 빈도를 여기에서만 노출합니다. 그들은 생산하지 않으며 반전을 고려하지 않습니다. 글쎄요, 아이디어는 다음과 같습니다. 트레일링 트립 후, 일반적으로 한 시간 또는 15분과 같은 기간이 끝날 때 몇 분을 기다렸다가 다시 켜고 표시기로 정렬을 결정하고 다음 시간까지 계속 이동합니다. 다음 여행 ... :-)))))
 
안녕하세요! 조언자에게 차이가 있습니까? 최소 보증금은 1000 & (달러 계정) 또는 1000 루블 (루블 계정)입니까?
 
Pavel777 :
안녕하세요! 조언자에게 차이가 있습니까? 최소 보증금은 1000 & (달러 계정) 또는 1000 루블 (루블 계정)입니까?
그것은 모두 고문에 달려 있으며뿐만 아니라. 내가 생각하는 가장 중요한 것은 거래 고문의 부지의 크기입니다.
 

친애하는 도움!!! 이미 완성된 전략의 마지막 단계에서 손이 떨어지고 있습니다. 거래를 평균할 수 없음

 bool PositionModify( const string smb, const double SL, const double TP)
  {       
       MqlTradeRequest mrequest={ 0 };
       MqlTradeResult   mresult ={ 0 };
      
      mrequest.action   = TRADE_ACTION_SLTP ;
      mrequest.symbol = _Symbol ;   
      mrequest.sl       = SL;
      mrequest.tp       = TP;
      
       OrderSend ( mrequest, mresult );
       if ( mresult.retcode == 10009 || mresult.retcode == 10008 ) //запрос выполнен или ордер успешно помещен
      {          
         Alert ( "Стопка прошла#:" , mresult.order, "!!" );
      }
       else
      {
         Alert ( "Стопка не прошла - код ошибки:" , GetLastError () );
         return ( false );
      }   
   return ( true );
  }

거래를 성사시키려고 합니다. 하지만 설정에서

PositionModify( Symbol, SL,ТР )

시가를 구해서 뭘 넣어야 할지 모르겠는데 평균을 낸 결과 가격을 어디로 옮겨야 하는지 궁금합니다. 아마도 그런 기능이 있을 것입니다.

또는 주문 이력을 통해서만 첫 번째 및 두 번째 주문의 가격을 알아내고 이미 이러한 데이터를 기반으로 평균을 구한다면 이 방법이 너무 복잡하지 않기를 바랍니다!!!

 datetime end= TimeCurrent ();                 // текущее серверное время
   datetime start=end- PeriodSeconds ( PERIOD_D1 ); // установим начало на сутки назад
//--- запросим в кэш программы нужный интервал торговой истории
   HistorySelect (start,end);
//--- получим количество сделок в истории
   int deals= HistoryDealsTotal ();
//--- получим тикет сделки, имеющей последний индекс в списке
   ulong deal_ticket= HistoryDealGetTicket (deals- 1 );
   if (deal_ticket> 0 ) // получили в кэш сделку, работаем с ней
     {
       //--- тикет ордера, на основании которого была проведена сделка
       ulong order     = HistoryDealGetInteger (deal_ticket, DEAL_ORDER );
       long order_magic= HistoryDealGetInteger (deal_ticket, DEAL_MAGIC );
       long pos_ID     = HistoryDealGetInteger (deal_ticket, DEAL_POSITION_ID );
    

double priceh   = HistoryDealGetInteger (deal_ticket, DEAL_PRICE );   // не могу определить цену открытия

       PrintFormat ( "Сделка #%d по ордеру #%d с ORDER_MAGIC=%d участвовала в позиции %d" ,                   deals- 1 ,order,order_magic,pos_ID);      }    else                // неудачная попытка получения сделки      {        PrintFormat ( "Всего в истории %d сделок, не удалось выбрать сделку" +                    " с индексом %d. Ошибка %d" ,deals,deals- 1 , GetLastError ());      }      //--- получим общее количество позиций    int positions= PositionsTotal (); //--- пробежим по списку ордеров    for ( int i= 0 ;i<positions;i++)      {        ResetLastError ();        //--- скопируем в кэш позицию по ее номеру в списке        string symbol= PositionGetSymbol (i); //  попутно получим имя символа, по которому открыта позиция        if (symbol!= "" ) // позицию скопировали в кэш, работаем с ней         {          long pos_id            = PositionGetInteger ( POSITION_IDENTIFIER );          double price           = PositionGetDouble ( POSITION_PRICE_OPEN );          ENUM_POSITION_TYPE type=( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE );          long pos_magic         = PositionGetInteger ( POSITION_MAGIC );          string comment         = PositionGetString ( POSITION_COMMENT );          if (pos_magic==EA_Magic)            {          

 PositionModify( Symbol (), NormalizeDouble (( - StopLoss* _Point ), 4 ),                                  NormalizeDouble (( + TakeProfit* _Point ), 4 )); //  ну здесь еще через запрос в зависимости от типа ордера

           }          PrintFormat ( "Позиция #%d по %s: POSITION_MAGIC=%d, цена=%G, тип=%s, комментарий=%s" ,                      pos_id,symbol,pos_magic,price, EnumToString (type),comment);         }        else            // вызов PositionGetSymbol() завершился неудачно         {          PrintFormat ( "Ошибка при получении в кэш позиции c индексом %d." +                      " Код ошибки: %d" , i, GetLastError ());         }      }


 
Top2n :

친애하는 도움!!! 이미 완성된 전략의 마지막 단계에서 손이 떨어지고 있습니다. 거래를 평균할 수 없음

거래를 성사시키려고 합니다. 하지만 설정에서

시가를 구해서 뭘 넣어야 할지 모르겠는데 평균을 낸 결과 가격을 어디로 옮겨야 하는지 궁금합니다. 아마도 그런 기능이 있을 것입니다.

또는 주문 이력을 통해서만 첫 번째 및 두 번째 주문의 가격을 알아내고 이미 이러한 데이터를 기반으로 평균을 구한다면 이 방법이 너무 복잡하지 않기를 바랍니다!!!

펜으로 시작하려면 평균화 알고리즘을 그려야 합니다. 어떤 이유로 인해 이제 음의 손절매 값을 전송하고 있지만 실제 손절매 가격이 있어야 합니다. 평균화 알고리즘에 따라 이러한 매개변수를 설정합니다.
 
이전에는 변수가 extern 유형이었으나 지금은 입력이지만 이미 상수인 extern은 더 이상 표시기 메뉴에 표시되지 않습니다. 이전과 같이 할 수 있습니까 아니면 이러한 값을 변경할 수 있도록 추가 변수를 생성해야 합니까?
 

안녕하세요 한 가지만 명확히 해주세요.

예를 들어 어드바이저가 있고 OnTick 이벤트가 있으며 조건에 따라 포지션이 열리거나 닫힙니다. EA는 기간을 설정할 수 있는 전략 테스터에서 테스트할 수 있습니다. 나는 그들이 어떻게 관련되어 있는지 이해하지 못합니다. 전략 테스터에서 EA를 테스트 할 때 모든 틱에 응답하지 않습니까? 아니면 테스터에서 지정된 시간 프레임에만 반응합니까? 질문이 명확하기를 바랍니다.

사유: