Скачать MetaTrader 5

где находится магик и как его изменить в Examples/Moving Averages.mq5?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Anatoliy Ivanov
6657
Anatoliy Ivanov 2010.06.09 09:29 

Подскажите пожалуйста где находится магик и как его изменить в Examples/Moving Averages.mq5?

Rashid Umarov
Админ
11988
Rashid Umarov 2010.06.09 09:39  
Для правильного и красивого оформления кода в своих сообщениях, пожалуйста, пользуйтесь возможностями редактора. Почитать об это можно в статье MQL5 Community - Памятка пользователя

Anatoliy Ivanov
6657
Anatoliy Ivanov 2010.06.09 09:46  
Rosh:
Для правильного и красивого оформления кода в своих сообщениях, пожалуйста, пользуйтесь возможностями редактора. Почитать об это можно в статье MQL5 Community - Памятка пользователя

код перенесен метотом копирования из MetaEditor MQL5
Rashid Umarov
Админ
11988
Rashid Umarov 2010.06.09 10:16  

Цитирую для Вас из статьи:

Кнопка   предназначена для вставки исходного кода MQL в текст сообщения. При нажатии появляется пустое окно, в которое необходимо вставить код и далее нажать кнопку Вставить. Для отмены вставки кода необходимо нажать кнопку Отмена.

Не рекомендуется выделять код полужирным шрифтом, чтобы выделить как-то по смыслу определенные куски. Дело в том, что в разных операционных системах и браузерах моноширинные шрифты отображаются по разному. Например, в Windows Vista используется моноширинный шрифт Consolas, у которого полужирное начертание для 10 размера практически не отличимо от обычного.

Anatoliy Ivanov
6657
Anatoliy Ivanov 2010.06.09 12:48  
Подскажите пожалуйста где находится магик и как его изменить в стандартном  Examples/Moving Averages.mq5?
/+------------------------------------------------------------------+
//|                                              Examples/Moving Averages.mq5 |
//|              Copyright Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor
input int    MovingPeriod       = 12;      // Moving Average period
input int    MovingShift        = 6;       // Moving Average shift
//---
int   ExtHandle=0;
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
//--- select lot size
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);
//--- calculate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      //--- select history for access
      HistorySelect(0,TimeCurrent());
      //---
      int    orders=HistoryDealsTotal();  // total history deals
      int    losses=0;                    // number of losses orders without a break

      for(int i=orders-1;i>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            break;
           }
         //--- check symbol
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol) continue;
         //--- check profit
         double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         if(profit>0.0) break;
         if(profit<0.0) losses++;
        }
      //---
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

   double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   MqlRates rt[2];
//--- go trading only for first ticks of new bar
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1) return;
//--- get current Moving Average 
   double   ma[1];
   if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- check signals
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(rt[0].open>ma[0] && rt[0].close<ma[0]) signal=ORDER_TYPE_SELL;    // sell conditions
   else
      if(rt[0].open<ma[0] && rt[0].close>ma[0]) signal=ORDER_TYPE_BUY;  // buy conditions
//--- additional checking
   if(signal!=WRONG_VALUE)
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         if(Bars(_Symbol,_Period)>100)
           {
            CTrade trade;
            trade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),
                               SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
                               0,0);
           }
//---
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   MqlRates rt[2];
//--- go trading only for first ticks of new bar
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1) return;
//--- get current Moving Average 
   double   ma[1];
   if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- positions already selected before
   bool signal=false;
   long type=PositionGetInteger(POSITION_TYPE);

   if(type==(long)POSITION_TYPE_BUY   && rt[0].open>ma[0] && rt[0].close<ma[0]) signal=true;
   if(type==(long)POSITION_TYPE_SELL  && rt[0].open<ma[0] && rt[0].close>ma[0]) signal=true;
//--- additional checking
   if(signal)
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         if(Bars(_Symbol,_Period)>100)
           {
            CTrade trade;
            trade.PositionClose(_Symbol,3);
           }
//---
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ExtHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(PositionSelect(_Symbol,50)) CheckForClose();
   else                           CheckForOpen();
//---
  }
//+------------------------------------------------------------------+

Спасибо за просветление.Отредактировать или удалить начальный комментарий не удается.Кнопка обновить на него не действует.

Валерий
1433
Валерий 2010.06.09 15:42  
ias:

В данном эксперте magic не устанавливается при открытии (по умолчанию, он будет = 0) и не проверяется при закрытии позы, т.е. закроет существующую позицию с любым мэйджиком.


Rashid Umarov
Админ
11988
Rashid Umarov 2010.06.10 15:30  
Класс Ctrade имеет метод SetExpertMagicNumber(), который позволяет один раз указать нужный ORDER_MAGIC. И этот ORDER_MAGIC будет использоваться при дальнейших торговых операциях. Посмотрите исходники класса.

Валерий
1433
Валерий 2010.06.10 16:24  
Rosh:
Класс Ctrade имеет метод SetExpertMagicNumber(), который позволяет один раз указать нужный ORDER_MAGIC. И этот ORDER_MAGIC будет использоваться при дальнейших торговых операциях. Посмотрите исходники класса.

Установить Magic просто, а вот контролировать его гораздо сложней. Если на инструменте работает только один советник, то и Magic не нужен. А вот если более одного, с разными Magic-aми, да в-придачу ещё и ручная работа, то это заставляет серьёзно призадуматься. Примеров пока не видел.
Anatoliy Ivanov
6657
Anatoliy Ivanov 2010.06.11 12:22  

Rosh:
Класс Ctrade имеет метод SetExpertMagicNumber(), который позволяет один раз указать нужный ORDER_MAGIC. И этот ORDER_MAGIC будет использоваться при дальнейших торговых операциях. Посмотрите исходники класса.

Правильно ли следущее:

     1.добавить

input  ulog     Magic1=12345; //устанавливаем магик1 для эксперта №1
input  ulog  Magic2=123456;//для эксперта №2
datetime      Period_t;       //для раличных таймфреймов

2. добавить в int OnInit()   

{

m_trade.SetExpertMagicNumber(Magic1);//изменяем Magic(который по умолчанию =0)

   3.работаем, в зависимости от условий(скажем, 2 эксперта в одном флаконе) с Magic1, или Magic2 в

void OnTick()
  {
//условие 2:
Period_t=PERIOD_D1;
if(Period_t=PERIOD_D1)
{m_trade.SetExpertMagicNumber(Magic2);}  
......
// условие 1:
 Period_t=PERIOD_M30;
if(Period_t=PERIOD_M30)
{m_trade.SetExpertMagicNumber(Magic1);}
........

Валерий
1433
Валерий 2010.06.11 12:35  

Да, правильно.

А что Вы с ним дальше делать будете ? Зачем он Вам нужен ?


Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий