Для правильного и красивого оформления кода в своих сообщениях, пожалуйста, пользуйтесь возможностями редактора. Почитать об это можно в статье MQL5 Community - Памятка пользователя
код перенесен метотом копирования из MetaEditor MQL5
Цитирую для Вас из статьи:
Кнопка
предназначена для вставки исходного кода MQL в
текст сообщения. При нажатии появляется
пустое окно, в которое необходимо вставить код и далее нажать кнопку Вставить.
Для отмены
вставки кода необходимо нажать кнопку Отмена.
Не рекомендуется выделять код полужирным шрифтом, чтобы выделить как-то по смыслу определенные куски. Дело в том, что в разных операционных системах и браузерах моноширинные шрифты отображаются по разному. Например, в Windows Vista используется моноширинный шрифт Consolas, у которого полужирное начертание для 10 размера практически не отличимо от обычного.
Подскажите пожалуйста где находится магик и как его изменить в стандартном 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(); //--- } //+------------------------------------------------------------------+
Спасибо за просветление.Отредактировать или удалить начальный комментарий не удается.Кнопка обновить на него не действует.
В данном эксперте magic не устанавливается при открытии (по умолчанию, он будет = 0) и не проверяется при закрытии позы, т.е. закроет существующую позицию с любым мэйджиком.
Класс Ctrade имеет метод SetExpertMagicNumber(), который позволяет один раз указать нужный ORDER_MAGIC. И этот ORDER_MAGIC будет использоваться при дальнейших торговых операциях. Посмотрите исходники класса.
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);} ........
Да, правильно.
А что Вы с ним дальше делать будете ? Зачем он Вам нужен ?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите пожалуйста где находится магик и как его изменить в Examples/Moving Averages.mq5?