Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1322

 
Добрый день, имеется множество однотипных индикаторных буферов, расчитать которые можно в цикле, но как сделать массив индикаторных буферов? Попробовал через стрктуру, и вроде бы все было хорошо, SetIndexBuffer() отработал без ошибок, но при наступлении OnCalculate() размеры массивов не меняются и остаются 0. Подскажите как организовать расчет индикаторных буферов в цикле, возможно по именам, типа: "buff_0",  "buff_1" и т.д., но как это сделать я не знаю(( А то очень длинная простыня получается(
 
SanAlex:

наверное так как Вы задумали - вроде получилось.

Спасибо!

Все верно, но не совсем, что я задумал !!! ордер ставятся по тренду (по индикатору) и закрываются по тейку и как только закрывается - открываются новый ордер в ту же сторону (по тренду), но это только одна  часть моей задумки.

Вторая заключается в том, что ордер - который не закрылся по тейку при развороте тренда (сигнала индикатора о изменении направления движения цены) должен не закрываться (что Вы и сделали), а к нему теперь - нужно применить Мартнгейл, т.е. открывать ордера не по тренду с определенным шагом, множителем и усреднением тейку. 

Короче две части должны работать в паре.

 
Alexey Viktorov:

Вчера скачал это чудо для посмотреть… И вдруг лишили меня тырнета. После грозы технические работы до конца дня. Вот и решил я от безделья переписать это чудо на MQL5, опубликован тут.

Получается нет худа без добра………

Спасибо большое!

Может и пригодится, если получится реализовать мою идею!

 
VANDER:
 Попробовал через стрктуру, и вроде бы все было хорошо

Разве так не работает?

int size=100;

struct All
   {
   double buff[];
   } all[];

int OnInit()
   {
   IndicatorBuffers(size);
   ArrayResize(all,size);
   for(int i=0; i<size; i++)
      {
      SetIndexBuffer(i,all[i].buff);
      SetIndexStyle(i,DRAW_LINE);
      }
   return(INIT_SUCCEEDED);
   }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
   {
   for(int i=0; i<size; i++)
      {
      all[i].buff[shift]=i;
      }
   return(rates_total);
   }
 

Sprut 185:

 а к нему теперь - нужно применить Мартнгейл, т.е. открывать ордера не по тренду с определенным шагом, множителем и усреднением тейку. 

Короче две части должны работать в паре.

Вы имеете ввиду что бы следующая позиция открывалась с удвоенным лотом 2-4-8-16 по BUY и противоположно 2-4-8-16 в SELL ???

 у меня такая функция есть - слепил себе как то.

//+------------------------------------------------------------------+
//| ENUM_LOT_RISK                                                    |
//+------------------------------------------------------------------+
enum LotMax
  {
   Lot=0,   // Lots
   Lotx2=1, // Lots*2
   Risk=2,  // Risk
  };
//+------------------------------------------------------------------+
input LotMax InpLotRisk              = Risk;         // : Lots,- Lots*2,- Risk
input double MaximumRisk             = 0.02;         // : Maximum Risk in percentage
input double DecreaseFactor          = 3;            // : Descrease factor
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
      return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
      return(0.0);
   if(margin<=0.0)
      return(0.0);
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,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 Expert Magic number
         if(HistoryDealGetInteger(ticket,DEAL_MAGIC)!=UNO_MAGIC)
            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);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double OptimizedBuy(void)
  {
   double PROFIT_BUY=0.00;
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions
     {
      string   position_GetSymbol=PositionGetSymbol(i); // GetSymbol позиции
      if(position_GetSymbol==m_symbol.Name())
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY)
           {
            PROFIT_BUY=PROFIT_BUY+m_position.Select(Symbol());
           }
        }
     }
   double Lots=MaximumRisk;
   double ab=PROFIT_BUY;
   switch(InpLotRisk)
     {
      case Lot:
         Lots=MaximumRisk;
         break;
      case Lotx2:
         if(ab>0 && ab<=1)
            Lots=MaximumRisk*2;
         if(ab>1 && ab<=2)
            Lots=MaximumRisk*4;
         if(ab>2 && ab<=3)
            Lots=MaximumRisk*8;
         if(ab>3)
            Lots=TradeSizeOptimized();
         break;
      case Risk:
         Lots=TradeSizeOptimized();
         break;
     }
   return(Lots);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double OptimizedSell(void)
  {
   double PROFIT_SELL=0.00;
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions
     {
      string   position_GetSymbol=PositionGetSymbol(i); // GetSymbol позиции
      if(position_GetSymbol==m_symbol.Name())
        {
         if(m_position.PositionType()==POSITION_TYPE_SELL)
           {
            PROFIT_SELL=PROFIT_SELL+m_position.Select(Symbol());
           }
        }
     }
   double Lots=MaximumRisk;
   double ab=PROFIT_SELL;
   switch(InpLotRisk)
     {
      case Lot:
         Lots=MaximumRisk;
         break;
      case Lotx2:
         if(ab>0 && ab<=1)
            Lots=MaximumRisk*2;
         if(ab>1 && ab<=2)
            Lots=MaximumRisk*4;
         if(ab>2 && ab<=3)
            Lots=MaximumRisk*8;
         if(ab>3)
            Lots=TradeSizeOptimized();
         break;
      case Risk:
         Lots=TradeSizeOptimized();
         break;
     }
   return(Lots);
  }
//+------------------------------------------------------------------+

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

надо заменить в открытии позиции - тут  вместо InpLots на OptimizedBuy() и OptimizedSell()

      if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,OptimizedBuy(),price,0.0,0.0))
      if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,OptimizedSell(),price,0.0,0.0))
 
SanAlex:

Вы имеете ввиду что бы следующая позиция открывалась с удвоенным лотом 2-4-8-16 по BUY и противоположно 2-4-8-16 в SELL ???

 у меня такая функция есть - слепил себе как то.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

надо заменить в открытии позиции - тут  вместо InpLots на OptimizedBuy() и OptimizedSell()

но для этой функции желательно ещё эту функцию иметь - что бы закрывало по профиту (в валюте)

input double InpTProfit              = 40000;        // : Take Profit --> (In currency the amount)
input double InpSLoss                = 1000000;      // : Stop Loss --> (In currency the amount)
//+------------------------------------------------------------------+
//| ProfitOnTick closing                                             |
//+------------------------------------------------------------------+
void ProfitOnTick(void)
  {
//---
   double PROFIT_BUY=0.00;
   double PROFIT_SELL=0.00;
   int total=PositionsTotal();
   for(int i=total-1; i>=0; i--)
     {
      string   position_GetSymbol=PositionGetSymbol(i);
      if(position_GetSymbol==m_symbol.Name())
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY)
           {
            PROFIT_BUY=PROFIT_BUY+PositionGetDouble(POSITION_PROFIT);
           }
         else
           {
            PROFIT_SELL=PROFIT_SELL+PositionGetDouble(POSITION_PROFIT);
           }
        }
      if(PROFIT_BUY<-InpSLoss || PROFIT_BUY>=InpTProfit)
        {
         CheckForCloseBuy();
        }
      if(PROFIT_SELL<-InpSLoss || PROFIT_SELL>=InpTProfit)
        {
         CheckForCloseSell();
        }
     }
  }
//+------------------------------------------------------------------+
 
SanAlex:

но для этой функции желательно ещё эту функцию иметь - что бы закрывало по профиту (в валюте)

Давайте я попробую более доходчиво объяснить смысл моей идеи и работу создаваемого советника.

Нужен простой Мартин - например Автопрофит 3, в котором нужно  добавить только, что бы открытие ордеров было по сигналу индикатора (по тренду), а не как у Автопрофита - как карта ляжет......... и всё.

Примерно с такими выходными параметрами как во вложенном файле.
Файлы:
pbx0dcw.jpg  201 kb
 
Sprut 185:

Давайте я попробую более доходчиво объяснить смысл моей идеи и работу создаваемого советника.

Нужен простой Мартин - например Автопрофит 3, в котором нужно  добавить только, что бы открытие ордеров было по сигналу индикатора (по тренду), а не как у Автопрофита - как карта ляжет......... и всё.

так он и открывает по сигналу индикатора - только если сигнал появляется противоположный он уже будет открывать в другую сторону. и если та позиция не закрылась по профиту она будет висеть пока не закроется по профиту. Если сигнал в другую сторону перевернулся и закрыл ту открытую Вам не подходит же. 

 
SanAlex:

так он и открывает по сигналу индикатора - только если сигнал появляется противоположный он уже будет открывать в другую сторону. и если та позиция не закрылась по профиту она будет висеть пока не закроется по профиту. Если сигнал в другую сторону перевернулся и закрыл ту открытую Вам не подходит же. 

Всё верно .......... и если та позиция не закрылась по профиту она будет висеть пока не закроется по профиту.

А нужно чтобы та позиция, которая  не закрылась по профиту (например в бай) осталась и ушла бы на определённый шаг в минус, где отрылся бы ещё один ордер (в бай)  с умноженным объёмом и усредненным тайком в минус и т.д. пока не развернётся тренд, но открытие позиций по треду не останавливалась бы. 

Вот почему я написал, что тут должны работать сразу 2 блока одновременно - Мартин и по индикатору.

Если что то плохо объяснил - готов по скайпу включить демонстрацию и показать наглядно, как должно это выглядеть. 

 
Sprut 185:

Всё верно .......... и если та позиция не закрылась по профиту она будет висеть пока не закроется по профиту.

А нужно чтобы та позиция, которая  не закрылась по профиту (например в бай) осталась и ушла бы на определённый шаг в минус, где отрылся бы ещё один ордер (в бай)  с умноженным объёмом и усредненным тайком в минус и т.д. пока не развернётся тренд, но открытие позиций по треду не останавливалась бы. 

Вот почему я написал, что тут должны работать сразу 2 блока одновременно - Мартин и по индикатору.

Если что то плохо объяснил - готов по скайпу включить демонстрацию и показать наглядно, как должно это выглядеть. 

Мартин должен включаться только при противоположном сигнале индикатора или не зависимо от этого?

Пример: Открыта позиция Buy в соответствии с индикатором. Цена опустилась на заданное расстояние, и индикатор уже показывает Sell. Позиции Buy должны открываться?

Причина обращения: