[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 702

 
keekkenen:

static int time = Time[0];

si (tiempo < Tiempo[0]){

// vela vieja

} si no {

// nueva vela

tiempo = Tiempo[0];

}

Ahora hay la mitad de ofertas que antes
 
T-G:
Ahora los oficios son la mitad de largos que antes

En lugar de comprobar si hay una nueva barra, sólo hay que hacer una pausa entre las aperturas, establecida en segundos:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}

Lo compruebo así (en negrita, ignora /*PauseMain*/ - es un valor aleatorio de retraso en minutos - de 5 a 9):

// Тут начало функции открытия позиций (открытие Buy)....

// Ниже код открытия Sell:        
          PauseMain51=random(5,9)*60;
         if (!Lot()) return;               // Средств не хватает на миним.- выходим
         if (!OpnSell51 || !Trade) return;
         if (ExistPositions(NULL, OP_SELL, 51, 0))  // Если есть такой же открытый Sell
               {
                 if (SecondsAfterOpenLastPos(NULL, OP_SELL, 51)<=/* PauseMain51*/ 7*60) return; (7*60 сек = 7 минут)
                  // Если прошло мало времени - валим
               }
//---------------------- Позиции ещё нету - открываемся...-----------------------------
         divider=1;
         Lots=GetSizeLot();
         Magic=51;                                          // Задаём магик... 5 и 1; 5 = пять минут, 1 = стратегия 1
         New_Comm="Sell_M5_Стратегия_1_Основная позиция";   // Задаём комментарий для позиции
         Lots_New=NormalizeLot(Lots/divider, False, NULL);
         OpenPosition(NULL,OP_SELL,Lots_New,0,pb-tp*po,Magic,New_Comm);

         return;            

Espero que tenga sentido...

 
Pregunta - ¿Es posible que los objetos gráficos no se simulen en el probador de estrategias en el modo no visual? Por ejemplo, estaba probando un código que abre operaciones rompiendo el canal OBJ_REGRESSION - se negocia en el modo visual, pero si lo desactivo, no hay operaciones... ¿Cómo llevar a cabo la optimización en este caso?
 
ToLik_SRGV:

Boris, pequeña corrección en el código, se me olvidó añadir un reset de la posición del array, al volver al lote original:


MUCHAS GRACIAS. Todo salió bien. ¡¡Va bien y pone los lotes correctos!!
 
Por favor, dime qué hacer y cambiar o añadir al código para establecer el ancho de la barra del histograma?
 
odiseif:
¿Cómo puedo cambiar o añadir algo al código para establecer el ancho de la barra en el histograma?

en los ajustes del indicador - tipo de línea, color y anchura/grosor
 
IgorM:

en la configuración del indicador - tipo de línea, color y grosor/anchura
SetIndexStyle(0, DRAW_NONE);
SetIndexStyle(1, DRAW_LINE,EMPTY);
SetIndexStyle(2, DRAW_NONE);
SetIndexStyle(3, DRAW_NONE);
SetIndexStyle(4, DRAW_NONE);
está aquí ....... pero mi herramienta tiene un ancho de línea de 0 y quiero poner el ancho de 2 para no tener que lidiar con la configuración ...... no sé cómo hacerlo .... no soy un programador .... así que ayúdame ))))
 

No sé nada de programación en absoluto. Quería hacer el filtro CCI (https://www.forex-tsd.com/indicators-metatrader-4/3356-cci-filter.html) igual para WPR, cambié CCI a WPR y cambié los niveles en las condiciones de coloración de las barras (no -100, 0, 100 como CCI, sino -60, -50 y -40, porque en MT WPR tiene un rango de -100 a 0, creo, ¿no?) Pero por alguna razón se compila con un error, y la pantalla muestra un indicador monocromático. ¿Qué ocurre? Gracias de antemano

#property copyright "Copyright © 2006, Forex-TSD.com "
#property link      "https://www.forex-tsd.com/"

#property indicator_separate_window
#property indicator_minimum -0.05
#property indicator_maximum 1.05
#property indicator_buffers 4
#property indicator_color1 MediumBlue
#property indicator_color2 Crimson
#property indicator_color3 LightBlue
#property indicator_color4 Orange



//---- input parameters
extern int PeriodWPR=18;
//---- indicator buffers
double UpBuffer1[];
double DnBuffer1[];
double UpBuffer2[];
double DnBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
  int init()
  {
   string short_name;
//---- indicator line
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2);
   SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,2);
   
   SetIndexBuffer(0,UpBuffer1);
   SetIndexBuffer(1,DnBuffer1);
   SetIndexBuffer(2,UpBuffer2);
   SetIndexBuffer(3,DnBuffer2);
   
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
//---- name for DataWindow and indicator subwindow label
   short_name="WPR Filter("+PeriodWPR+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"UpTrend");
   SetIndexLabel(1,"DownTrend");
   SetIndexLabel(2,"Mild UpTrend");
   SetIndexLabel(3,"Mild DownTrend");
   
//----
   SetIndexDrawBegin(0,PeriodWPR);
   SetIndexDrawBegin(1,PeriodWPR);
   SetIndexDrawBegin(2,PeriodWPR);
   SetIndexDrawBegin(3,PeriodWPR);  
//----
   return(0);
  }

//+------------------------------------------------------------------+
//| WPRFilter                                                         |
//+------------------------------------------------------------------+
int start()
  {
   int shift,trend;
   double WPR0;

   
   for(shift=Bars-PeriodWPR-1;shift>=0;shift--)
   {    
   WPR0=iWPR(NULL,0,PeriodWPR,PRICE_CLOSE);
        
          if (WPR0>-50 && WPR0<-40)  trend=1;
          if (WPR0>-40)  trend=2;  
          if (WPR0<-50 && WPR0>-60) trend=-1;
          if (WPR0<-60)  trend=-2;
          
          if (trend==1) 
          {
          
          UpBuffer1[shift]=0;
          UpBuffer2[shift]=1;
          DnBuffer1[shift]=0;
          DnBuffer2[shift]=0;
          
          }
          if (trend==2) 
          {
          
          UpBuffer1[shift]=1;
          UpBuffer2[shift]=0;
          DnBuffer1[shift]=0;
          DnBuffer2[shift]=0;
          
          }
          if (trend==-1) 
          {
           
          UpBuffer1[shift]=0;
          UpBuffer2[shift]=0;
          DnBuffer1[shift]=0;
          DnBuffer2[shift]=1;
          }
          
          if (trend==-2) 
          {
          
          UpBuffer1[shift]=0;
          UpBuffer2[shift]=0;
          DnBuffer1[shift]=1;
          DnBuffer2[shift]=0; 
          
          }
        }
        return(0);      
 }
 
Infinity:

La memoria es inútil).

Quiero saber qué tipo de moneda, prescribió las variables

cadena EUR="EURUSD";
cadena GBP="GBPUSD";

string symbl = "";

Escribo lo siguiente al principio :

symbl = symbl(); //recibir el valor del símbolo

Quiero comparar el valor recibido de symbl con los valores de mis variables, y si coinciden, entonces tomar una decisión.

switch (symbl) {

caso .......... entonces no pasa nada (( break;

caso ................ break;

}

Refresca mi memoria))

Me he dado cuenta de que sólo se puede utilizar una constante de carácter, pero ¿cómo lo hago?


 
Infinity:

La memoria es inútil).

Quiero saber qué tipo de moneda, prescribió las variables

cadena EUR="EURUSD";
cadena GBP="GBPUSD";

string symbl = "";

Escribo lo siguiente al principio :

symbl = symbl(); //recibir el valor del símbolo

Quiero comparar el valor recibido de symbl con los valores de mis variables, y si coinciden, entonces tomar una decisión.

switch (symbl) {

caso .......... entonces no pasa nada (( break;

caso ................ break;

}

Refresca tu memoria ))


Los muelles del conmutador dicen claramente que la expresión entre paréntesis, es decir, symbl debe ser de tipo entero, pero tú lo estás encadenando...