初学者的问题 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)打开它,结果是一样的,它打开后把止损放在了Demo上,在策略测试器中止损是0,我不知道可能是什么问题。

 
你好,亲爱的程序员。我认为程序员就像神一样--无中生有,凭空创造出工作的东西,创造出物质的东西,实在是太神奇了......我读了一篇关于时间的文章,但里面没有说要设置周期,甚至没有说周期,而是在特定时间启用和禁用一个专家顾问。我不知道是否有人曾问过这个问题。我必须重新命名我的EA,以便在不同时间启动和停止,但由于MT5只有一对--一个EA,我必须在它们之间手动切换。谢谢
 
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分钟,等待几分钟,让它再次打开,通过指标确定布局,然后进入下一个止损...:-))))
 
你好,请你告诉我,对于一个EA来说,最低存款1000&(美元账户)或1000卢布(卢布账户)是否有区别?
 
Pavel777:
你好,你能告诉我,对于一个EA来说,最低存款1000&(美元账户)或1000卢布(卢布账户)是否有区别?
这一切都取决于专家顾问,而不仅仅是。我认为最主要的是EA的手数大小。
 

已经在最后一步灰心了,从现成的战略。不能平均交易,通过

 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类型,现在是input,但它已经是一个常数了,extern现在没有显示在指标菜单中。是否可以像以前一样,或者有必要创建额外的变量以能够改变这些值?
 

你好,请澄清一件事。

例如,我们有一个带有OnTick事件的EA,它将根据条件打开或关闭一个头寸。你可以在策略测试器中测试该EA,在那里你可以设置时间框架。我看不出它们之间有什么相互联系。该EA 不是在策略测试器中进行了测试,而且对每一个tick都有反应吗?或者它只对策略测试器中选定的时间框架做出反应?我希望这个问题是清楚的