Напишу советник бесплатно - страница 168

 
Aesen #:
Привет, Антон, не могли бы вы помочь мне сделать мой советник On Balance Volume Divergence более стабильно прибыльным? Может быть, изменить некоторые вещи в коде или добавить некоторые функции и сделать его лучше, пожалуйста. Код полностью рабочий, но я не удовлетворен результатами, которые я получаю от него.
#include <trade/trade.mqh>

input double Lots = 0.01;
input int VerificationCandles = 20;
input int TimeGapCandles = 5;

input int TpPoints = 1000;
input int SlPoints = 1000;

int totalBars;
int handleOBV;

datetime timeLow1, timeLow2, timeHigh1, timeHigh2;
double low1, low2, high1, high2;
datetime timeLowOBV1, timeLowOBV2, timeHighOBV1, timeHighOBV2;
double lowObv1, lowObv2, highObv1, highObv2;

int OnInit(){
   totalBars = iBars(_Symbol,PERIOD_CURRENT);
   
   handleOBV = iOBV(_Symbol,PERIOD_CURRENT,VOLUME_TICK);

   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason){

}

void OnTick(){
   int bars = iBars(_Symbol,PERIOD_CURRENT);
   if(totalBars != bars){
      totalBars = bars;
      
      datetime newTime = 0;
      double newlow = 0, newhigh = 0;
      findHighLow(newlow,newhigh,newTime);
      
      datetime newTimeObv = 0;
      double newlowOBV = 0, newhighOBV = 0;      
      findHighLowOBV(newlowOBV,newhighOBV,newTimeObv); 
      
      if(newlow != 0 || newlowOBV != 0){
         if(newlow != 0){
            low2 = low1;
            timeLow2 = timeLow1;
            low1 = newlow;
            timeLow1 = newTime;            
         }   
         if(newlowOBV != 0){
            lowObv2 = lowObv1;
            timeLowOBV2 = timeLowOBV1;
            lowObv1 = newlowOBV;
            timeLowOBV1=newTime;
         }
         
         ulong timeGap = TimeGapCandles * PeriodSeconds(PERIOD_CURRENT);
         if(low1 < low2 && lowObv1 > lowObv2 && (ulong)MathAbs(timeLow1-timeLowOBV1) < timeGap && (ulong)MathAbs(timeLow2-timeLowOBV2) < timeGap){
            Print(__FUNCTION__," > New Buy Signal...");
            
            double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            ask = NormalizeDouble(ask,_Digits);
            
            double tp = ask + TpPoints * _Point;
            tp = NormalizeDouble(tp,_Digits);
            
            double sl = ask - SlPoints * _Point;
            sl = NormalizeDouble(sl,_Digits);
            
            CTrade trade;
            trade.Buy(Lots,_Symbol,ask,sl,tp);                 
         }
      } 
         
         if(newhigh != 0 || newhighOBV != 0){
            if(newhigh != 0){
               high2 = high1;
               timeHigh2 = timeHigh1;
               high1 = newhigh;
               timeHigh1 = newTime;
            }
            if(newhighOBV != 0){
               highObv2 = highObv1;
               timeHighOBV2 = timeHighOBV1;
               highObv1 = newhighOBV;
               timeHighOBV1 = newTimeObv;
            }
            
           ulong timeGap = TimeGapCandles * PeriodSeconds(PERIOD_CURRENT);
           if(high1 > high2 && highObv1 < highObv2 && (ulong)MathAbs(timeHigh1-timeHighOBV1) < timeGap && (ulong)MathAbs(timeHigh2-timeHighOBV2) < timeGap){
            Print(__FUNCTION__," > New Sell Signal...");
            
            double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            bid = NormalizeDouble(bid,_Digits);
            
            double tp = bid - TpPoints * _Point;
            tp = NormalizeDouble(tp,_Digits);
            
            double sl = bid + SlPoints * _Point;
            sl = NormalizeDouble(sl,_Digits);
            
            CTrade trade;
            trade.Sell(Lots,_Symbol,bid,sl,tp);                  
         }   
      }
   }             
} 
     
void findHighLow(double &newlow, double &newhigh, datetime &newTime){
   int indexBar = VerificationCandles+1;
   double high = iHigh(_Symbol,PERIOD_CURRENT,indexBar);
   double low = iLow(_Symbol,PERIOD_CURRENT,indexBar);
   datetime time = iTime(_Symbol,PERIOD_CURRENT,indexBar);
      
   bool isHigh = true, isLow = true;
   for(int i = 1; i <= VerificationCandles; i++){
       double highLeft = iHigh(_Symbol,PERIOD_CURRENT,indexBar+i);
       double highRight = iHigh(_Symbol,PERIOD_CURRENT,indexBar-i);
       if(highLeft > high || highRight > high) isHigh = false;
         
       double lowLeft = iLow(_Symbol,PERIOD_CURRENT,indexBar+i);
       double lowRight = iLow(_Symbol,PERIOD_CURRENT,indexBar-i);
       if(lowLeft < low || highRight < low) isLow = false;
          
       if(!isHigh && !isLow) break;
       if(i == VerificationCandles){
         if(isHigh){
            Print(__FUNCTION__," > Found a new high (",DoubleToString(high,_Digits),") at ",time,"...");
            ObjectCreate(0,"High@"+TimeToString(time),OBJ_ARROW_SELL,0,time,high);
            newhigh = high;
            newTime = time;  
         }            
         if(isLow){
            Print(__FUNCTION__," > Found a new low (",DoubleToString(low,_Digits),") at ",time,"...");
            ObjectCreate(0,"Low@"+TimeToString(time),OBJ_ARROW_BUY,0,time,low); 
            newlow = low;
            newTime = time;               
         }
      }   
   }
}
   
void findHighLowOBV(double &newlow, double &newhigh, datetime &newTime){
   int indexBar = VerificationCandles;
   double OBV[];
   if(CopyBuffer(handleOBV,0,1,VerificationCandles*2+1,OBV) < VerificationCandles *2+1) return;
   
   double value = OBV[indexBar];
   datetime time = iTime(_Symbol,PERIOD_CURRENT,indexBar+1);
      
   bool isHigh = true, isLow = true;
   for(int i = 1; i <= VerificationCandles; i++){
       double valLeft = OBV[indexBar+i];
       double valRight = OBV[indexBar-i];
       if(valLeft > value || valRight > value) isHigh = false;      
       if(valLeft < value || valRight < value) isLow = false;
          
       if(!isHigh && !isLow) break;
       if(i == VerificationCandles){
         if(isHigh){
            Print(__FUNCTION__," > Found a new high (",DoubleToString(value,_Digits),") at ",time,"...");
            ObjectCreate(0,"High@"+TimeToString(time),OBJ_ARROW_SELL,1,time,value);
            newhigh = value;
            newTime = time;    
         }
         if(isLow){
            Print(__FUNCTION__," > Found a new low (",DoubleToString(value,_Digits),") at ",time,"...");
            ObjectCreate(0,"Low@"+TimeToString(time),OBJ_ARROW_BUY,1,time,value);
            newlow = value;
            newTime = time;    
         }
      }   
   }
} 
Файлы:
 
Aesen #:

Некоторые функции, которые я имел в виду, которые было бы неплохо иметь в советнике, это трендовые линии для скрытых и регулярных дивергенций на ценовых графиках и индикатор obv, возможно, хороший трейлинг-стоп, а также входы, которые выглядят примерно так:


Переменная Значение

Регулярная дивергенция Истина/Ложь

Скрытая дивергенция Истинно/Ложно

Трендовые линии индикатора Истинно/Ложно

Линии ценового тренда True/False


Я пытаюсь заставить советника OBV Divergence следовать этой шпаргалке по дивергенции, которую я получил с babypips.com:


Бычья дивергенция(разворот вверх):

Цена свечи - более низкий минимум

Балансовый объем - более высокий минимум


Медвежья дивергенция (разворот вниз):

Цена свечи - более высокий максимум

Балансовый объем - более низкий максимум


Бычья скрытая дивергенция (продолжение трендавверх):

Цена свечи - более высокий минимум

Балансовый объем - более низкий минимум


Медвежья скрытая дивергенция (продолжение трендавниз):

Цена свечи - более низкий максимум

Балансовый объем - более высокий максимум

A New Approach to Interpreting Classic and Hidden Divergence. Part II
A New Approach to Interpreting Classic and Hidden Divergence. Part II
  • www.mql5.com
The article provides a critical examination of regular divergence and efficiency of various indicators. In addition, it contains filtering options for an increased analysis accuracy and features description of non-standard solutions. As a result, we will create a new tool for solving the technical task.
 
Aesen #:

Некоторые функции, которые я имел в виду, которые было бы неплохо иметь в советнике, это трендовые линии для скрытых и регулярных дивергенций на ценовых графиках и индикатор obv, возможно, хороший трейлинг-стоп, а также входы, которые выглядят примерно так:


Переменная Значение

Регулярная дивергенция Истина/Ложь

Скрытая дивергенция Истинно/Ложно

Трендовые линии индикатора Истинно/Ложно

Линии ценового тренда True/False


Я пытаюсь заставить советника OBV Divergence следовать этой шпаргалке по дивергенции, которую я получил с babypips.com:


Бычья дивергенция(разворот вверх):

Цена свечи - более низкий минимум

Балансовый объем - более высокий минимум


Медвежья дивергенция (разворот вниз):

Цена свечи - более высокий максимум

Балансовый объем - более низкий максимум


Бычья скрытая дивергенция (продолжение трендавверх):

Цена свечи - более высокий минимум

Балансовый объем - более низкий минимум


Медвежья скрытая дивергенция (продолжение трендавниз):

Цена свечи - более низкий максимум

На балансовом объеме - более высокий максимум

Еще одна функция, которую я имел в виду, это то, что советник будет складывать больше сделок, если он идет в пользу первой сделки, которую он размещает, если это имеет смысл.


например, когда советник обнаруживает бычью дивергенцию, появляется сигнал на покупку и размещается первая сделка на покупку, если торговля идет в пользу первой сделки на покупку, которую разместил советник, то советник будет складывать больше сделок в направлении покупки и наоборот, если это была сделка на продажу.
 
Aesen #:

Еще одна функция, которую я имел в виду, заключается в том, что советник будет складывать больше сделок, если он идет в пользу первой сделки, которую он размещает, если это имеет смысл.....


например, когда советник обнаруживает бычью дивергенцию и есть сигнал на покупку, и первая сделка на покупку размещается, если торговля идет в пользу первой сделки на покупку, которую разместил советник, то советник будет складывать больше сделок в направлении покупки и наоборот, если это была сделка на продажу.
Можете ли вы также включить стратегию хеджирования восстановления зоны , где первая сделка инициируется, скажем, на покупку с размером лота 0.01, и когда она идет в отрицательном направлении с некоторым количеством пунктов, скажем, ниже на 30 пунктов, активируется встречная продажа с большим размером лота, скажем, 0.02, где, если она продолжает идти вниз, сделки закрываются в безубытке или с прибылью, и цикл начинается снова. Однако, если продажа не сработает и цена пойдет вверх, активируется еще одна сделка на покупку с более высоким размером лота, скажем, 0,03, по той же цене, по которой была начата первая покупка. Если она продолжится вверх и чистый результат будет прибыльным, цикл закрывает сделки с прибылью и начинается снова. Таким образом, разрыв в 30 пунктов фиксируется и называется зоной восстановления, что делает его прибыльным для более высоких счетов, устраняя потери. Если это возможно запрограммировать
 
код скрипта предназначен для Mt5, а не для mt4
 

Здравствуйте. Напишите, пожалуйста, для МТ4 советника: 

закрывает все ранее открытые вручную сделки при касании МА (со всеми доступными настройками мувинга) текущей цены. Больше ничего (это вроде советник-полуавтомат?). 

 
torrr текущей цены. Больше ничего.

Здравствуйте,

Я только что приготовила его и не успела протестировать. Надеюсь, это вам поможет.

С уважением.

//+------------------------------------------------------------------+
//|                                                     Practica.mq4 |
//|                        Copyright 2022, Antonio Simón Del Vecchio |
//|                    https://www.mql5.com/es/users/simondelvecchio |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Antonio Simón Del Vecchio"
#property link      "https://www.mql5.com/es/users/simondelvecchio"
#property version   "1.00"
#property strict


input int Periodo = 50;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OrdersTotal() > 0 && CruceMediaPrecio())
     {
      Cerrar();
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Cerrar()
  {
   double Precio = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS))
        {
         if(OrderType() == OP_BUY)
            Precio = Bid;
         else
            Precio = Ask;
         if(!OrderClose(OrderTicket(), OrderLots(), Precio, 3, clrNONE))
            Print("Error al cerrar la órden: ", GetLastError());
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CruceMediaPrecio()
  {
   double Media = iMA(Symbol(), PERIOD_CURRENT, Periodo, 0, MODE_SMA, PRICE_CLOSE, 0);
   double Max = iHigh(Symbol(), PERIOD_CURRENT, 0);
   double Min = iLow(Symbol(), PERIOD_CURRENT, 0);
   if(Max > Media && Min < Media)
     {
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
 

To: Antonio Simon Del Vecchio

Спасибо! Я чайник... Мне надо в MetaEditor создать советник, вставить этот код, скомпилировать, и все?

 
torrr советника в MetaEditor, вставить этот код, скомпилировать его и все?
Правильно. Когда вы скомпилируете его, будет сгенерирован советник с именем, которое вы дали этому файлу в редакторе MetaEditor.

Теперь я спрашиваю в общем для тех, кто может меня прочитать: поскольку я поделился кодом, запрещено ли делиться советником? Я имею в виду .exe файл?
 

Antonio Simon Del Vecchio Я только что приготовила его и не успела протестировать.

Все работает! Спасибо! Но, у меня нет опыта в работе с такими инструментами, и по-этому неожиданно после проверки понял, что я ошибся и не указал просьбу в ТЗ: исправьте, пожалуйста, чтобы Советник закрывал только ту валютную пару (один или несколько ордеров), на график которой он брошен.