Нужна помошь: советник с кастомным индикатором не торгует по сигналам индикатора! - страница 5

 
//+------------------------------------------------------------------+
//| возвращает количество ордеров этого типа                         |
//+------------------------------------------------------------------+
int OrdersTotalByType(int _OrderType)
  {
//----
   int res;
   for (int i=0;i<OrdersTotal();i++)
      {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if (OrderType()!=_OrderType) continue; // не наш тип ордера берем следующий 
         res++;
         }
      }
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| закрывает все ордера указанного типа                             |
//+------------------------------------------------------------------+
void CloseOrders(int _OrderType)
  {
  double ClosePrice;
  bool res;
  int err, N=1;
  
//----
   for (int cnt=OrdersTotal()-1;cnt>=0;cnt--)
      {
      if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {
//         Print(cnt);
         if (OrderType()!=_OrderType) continue;
         RefreshRates();
         if (_OrderType==OP_BUY)  ClosePrice=NormalizeDouble(Bid,Digits);
         if (_OrderType==OP_SELL) ClosePrice=NormalizeDouble(Ask,Digits);
         res=OrderClose(OrderTicket(),OrderLots(),ClosePrice,slippage,Black);
         if (!res) Print("Не удалось закрыть ордер типа ",_OrderType," №=",OrderTicket());
//         if  (res) Print("Ордер типа ",_OrderType," №",OrderTicket()," закрыли с ",N," попытки"," сек=",Bars);
//         if (res) Sleep(SleepOk);
         }
      }
//Trade = false; // запрет работы до нового бара
//Print("CloseOrders акт--",action);
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OpenOrder(int _OrderType)
  {
//----
   int res=0;
      while(OrdersTotal()<nOrder)
         {
         res=Deal(_OrderType);
         if(res==0) return; // выход из-за крит ошибки
         }
////время для отдыха после сделки
//int TimeForSleep = 10;
// Sleep(TimeForSleep*1000);
// запрет торговли до появления нового бара (флаг работоспособности эксперта)
if(OrdersTotal()==nOrder)
   {
   Trade = false;
//   Print("Вариант--",action); 
   }
//----
   return;
  }
//+------------------------------------------------------------------+
//|Сделка                                      |
//+------------------------------------------------------------------+ 
int Deal(int _OrderType)
  {
//----
   if(OrdersTotal() >= nOrder) return(0);        // если есть N открытых ордера то выход
   
   int N = 0;
   int ticket;
   int err;
   double Price_open;
   double Lots;
   int cmd;
   
 
  Lots = 0.1; //убрать
//   Lots = CalculateVolume(); //Print("Лот=",Lots);
   if(Lots<0.1) return(0);
 
   RefreshRates();
   if(_OrderType == OP_BUY)  Price_open = NormalizeDouble(Ask, Digits);
   if(_OrderType == OP_SELL) Price_open = NormalizeDouble(Bid, Digits);
      
// Отсылаем ордер                  
   ticket = OrderSend(Symbol(), _OrderType, Lots, Price_open, slippage,0, 0, 0, Magic);
   if(ticket > 0) return(ticket); // выход если все ок
 
// Если не отослался, то пытаемся 5 раз снова его открыть      
   else
     {
       while(N < count)
         {
           N++;
           err = ErrorBlock();
           if(err == 1)
             {
               RefreshRates();
               if(_OrderType == OP_BUY) Price_open = NormalizeDouble(Ask, Digits);
               if(_OrderType == OP_SELL)Price_open = NormalizeDouble(Bid, Digits);              
               ticket = OrderSend(Symbol(), _OrderType, Lots, Price_open, slippage, 0, 0, 0, Magic);
               if(ticket > 0)return(ticket);
             }
           // получили серьезную ошибку  
           if(err > 1)
            {
            Print("Deal---получили серьезную ошибку -", _OrderType, "- OrdersTotal=",OrdersTotal()," Число попыток N=",N," err=",err);
            return(0);                          
            }
         }                                                       
     }
//---- 
   return(0);
  }
Может это поможет. Брал за аналоги коды выложенные в свободном доступе. Модифицировал их под свои задачи. Это один из рабочих вариантов. Возможно есть и ошибки перепроверь. Это блоки (кирпичики) из которых можно построить хорошую ТС. Ищи коды KimIV и kompostera. Они мастера высшего пилотажа MQL, а я так ремесленник и то наверное влучшем случае.
 
Вот я тут набросал советника... грубо очень, программирую около месяца, просто скопировал код индикатора в свой шаблон, с небольшими поправками. В частности в цикле индикатора в строке
for(shift = Bars - 2; shift >= 0; shift--)
изменил 0 на 1, чтобы не было ложных сигналов при так называемой "перерисовке".
Файлы:
 
Вот код индикатора:
#property indicator_chart_window
#include <stdlib.mqh>
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_width1 2 
#property indicator_color2 Red
#property indicator_width2 2
 
 
//+------------------------------------------------------------------
 
//| Common External variables                                        
 
//+------------------------------------------------------------------
 
 
//+------------------------------------------------------------------
 
//| External variables                                               
 
//+------------------------------------------------------------------
 
extern double nPips = 0.004;
 
//+------------------------------------------------------------------
 
//| Special Convertion Functions                                     
 
//+------------------------------------------------------------------
 
 
int LastTradeTime;
double ExtHistoBuffer[];
double ExtHistoBuffer2[];
 
void SetLoopCount(int loops)
{
}
 
void SetIndexValue(int shift, double value)
{
  ExtHistoBuffer[shift] = value;
}
 
void SetIndexValue2(int shift, double value)
{
  ExtHistoBuffer2[shift] = value;
}
 
//+------------------------------------------------------------------
 
//| End                                                              
 
//+------------------------------------------------------------------
 
 
//+------------------------------------------------------------------
 
//| Initialization                                                   
 
//+------------------------------------------------------------------
 
 
int init()
{
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, ExtHistoBuffer);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);
   SetIndexArrow(1, 234);
   SetIndexBuffer(0, ExtHistoBuffer);
   SetIndexBuffer(1, ExtHistoBuffer2);
   return(0);
}
int start()
{
//+------------------------------------------------------------------
 
//| Local variables                                                  
 
//+------------------------------------------------------------------
 
int shift = 0;
double cnt = 0;
double TrStopLevel = 0;
double PREV = 0;
double pass = 0;
 
SetLoopCount(0);
// loop from first bar to current bar (with shift=0)
for(shift=Bars-2;shift>=0 ;shift--){ 
 
 
if( (Close[shift] == PREV) ) 
{
TrStopLevel=PREV;
 
}
else 
{
if( (Close[shift+1])<PREV && (Close[shift]<PREV)  ) 
{
TrStopLevel=MathMin(PREV,Close[shift]*(1+nPips));
}
 
      else 
      {
            if( ((Close[shift+1])>PREV) && (Close[shift]>PREV) ) 
            {
            TrStopLevel=MathMax(PREV,Close[shift]*(1-nPips));
            }
 
 
            else 
                  {
                  if( (Close[shift]>PREV) ) 
                  {                   
                  TrStopLevel=Close[shift]*(1-nPips);
                  }
 
                        else TrStopLevel=Close[shift]*
(1+nPips);
                  }
      }
}
 
 
if( Close[shift] > TrStopLevel &&  Close[shift+1]<PREV && PREV != 
0 ) 
{
//SetOrder(OP_BUY,1,ask,2,0,ask+TakeProfit*Point,blue);
//Alert("buy");
SetIndexValue(shift, TrStopLevel);
}
 
 
if( Close[shift] < TrStopLevel &&  Close[shift+1]>PREV  && PREV != 
0  ) 
{
//SetOrder(OP_SELL,1,bid,2,0,bid-TakeProfit*Point,Red);
SetIndexValue2(shift, TrStopLevel);
//Alert("Sell");
}
 
 
PREV=TrStopLevel;
//Alert(TrStopLevel);
} 
 
  return(0);
}
Помогите пожалуйста.. Как можно добавить к этому индикатору звуковой сигнал?
Причина обращения: