Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 505

 
Forexman77:
Lo necesitas, por supuesto. Pues bien, ¿cómo aplicar esta construcción a la búsqueda del mínimo? No puedo hacerlo con mi cerebro)

Para encontrar el máximo, se asigna a la variable val el valor 0 (obviamente menor que cualquiera de los valores de los indicadores).

Esto significa que para encontrar el mínimo, debemos añadir un valor deliberadamente más alto. Se puede utilizar la constante EMPTY_VALUE o el valor del indicador directamente en alguna barra entre las que se busca el mínimo.

val=EMPTY_VALUE;

for(i=1;i<=15;i++) {

    ind=iMA(...,i);

   if(ind< val) val=ind;

}

O así:

val=MA(...,1);


for(i=2;i<=15;i++) {

    ind=iMA(...,i);

   if(ind< val) val=ind;

}
 
Forexman77:

¡Claro que sí! Bien, ¿cómo se aplica esta construcción para encontrar el mínimo? No puedo entenderlo).
Y quiero aprender a declarar un array. Lo intenté de esta manera:

Sale -1.



El bucle pasa por 34 valores y el array sólo contiene 33 celdas, correcto.

Y prueba con ArrayMinimum(num_array,WHOLE_ARRAY,0);

 
Forexman77:

... También quiero aprender a declarar un array...

Si sólo es para el entrenamiento y el propósito cognitivo...

El periodo en el que se determinan los mínimos y los máximos - debe ser un parámetro externo que permita el ajuste y la optimización.

extern int p=34; 

Así que, en primer lugar, el array se declara sin tamaño:

double val[];

La declaración del array se hace en una sección común, no en una función.

En la función init, el tamaño se establece en el array:

int init(){

   ArrayResize(val,p);

} 

Ahora en la función de inicio llenamos el array:

for(int i=0;i<p;i++) val[i]=iMA(...,i+1);

Por último , se aplican ArrayMaximum() y ArrayMinimum() a la matriz.

 
Integer:

Para encontrar el máximo, se asigna a la variable val el valor 0 (obviamente menor que cualquiera de los valores de los indicadores).

Esto significa que para encontrar el mínimo, debemos añadir un valor deliberadamente más alto. Se puede utilizar la constante EMPTY_VALUE o el valor del indicador directamente en alguna barra entre las que se busca el mínimo.

O así:

¡Muchas gracias!
 
evillive:

El bucle pasa por 34 valores, mientras que el array sólo contiene 33 celdas, arréglalo.

Y prueba con ArrayMinimum(num_array,WHOLE_ARRAY,0);

¡Muchas gracias!
 

Queridos compañeros programadores Estoy en problemas, por favor ayúdenme.

Ya me he devanado los sesos con este código.

//В условии прописано что работаем с 
if(OrderType() == OP_BUY){}
//, но метатрейдер почему то игнорирует это условие, и работает только с OP_SELLLIMIT

Aquí está la función completa:

//+------------------------------------------------------------------+
//| Модифицируем стоплоссы                                           |
//+------------------------------------------------------------------+   
void modify_stoploss()
  {
   for(int i=0; i<=OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderMagicNumber()==magic)
              {
               if(OrderType() == OP_BUY)
                 {
                  if(chek_way()==1)
                    {
                     double stoploss=NormalizeDouble(pre_openPrice(OP_BUY),Digits);
                     Print("Стоплосс для Бай ",OrderTicket()," = ", stoploss);
                     OrderModify(OrderTicket(),OrderOpenPrice(),stoploss,OrderTakeProfit(),0,CLR_NONE);
                    }
                 }
               if(OrderType() == OP_SELL)
                 {
                  if(chek_way()==0)
                    {
                     stoploss=NormalizeDouble(pre_openPrice(OP_SELL),Digits);
                     Print("Стоплосс для Cелл ",OrderTicket()," = ", stoploss);
                     OrderModify(OrderTicket(),OrderOpenPrice(),stoploss,OrderTakeProfit(),0,CLR_NONE);
                    }
                 }
              }
           }
        }
     }
  }

Alcanza a imprimir y esto es lo que sale:


Mientras que el ticket: 225299700 es un ticket de pedido OP_SELLLIMIT.

Y modifica el stop loss de esta orden seleccionada como se esperaba. Pero OP_BUY no se ve, aunque estoy seguro de que existe:

¿Cuál puede ser el problema? ¿Por qué me hace esto? Por favor, ayúdenme a entender.

 
#property strict
#include <Indicators\Trend.mqh>
bool ind;
CiMA MA;
extern int pos=1;
extern int sl=40;
extern int tp=70;
datetime time;
datetime time2;
bool trade=false;
bool trade2=false;
int a,b;
int OnInit()
  {
//---
   MA.Create(Symbol(),PERIOD_CURRENT,10,6,MODE_EMA,PRICE_CLOSE);//создал машку
//---
   return(INIT_SUCCEEDED);
   
  }
void OnTick()
  {
//---
  if(IsNewBar()==true)//если новый бар включаемся
     {
     if(buy(pos)==true)//если цена выше МА продолжаем
     {
      if(!ExistPositions(Symbol(),-1,-1,0))//если нету открых ордеров продолжаем
        {

         if(GetTypeLastClosePos(Symbol(),-1)!=OP_BUY)//если тип последней закрытой позиции был не на покупку то тогда только покупаем таким образом я пред остерегаюсь от повторных входов в покупку если цена 
//все ещо выше МА...но почему то не работает открываются и дальше сделки на покупку если ордер закрылся выше МА....ХОТЯ НЕ ДОЛЖО ТАК КАК Я ОГРАНИЧИЛ ПО ТИПУ ПОЗИЦИИ ПОСЛЕДНЮЮ СДЕЛКУ И ОНИ ДОЛЖНЫ ТОЛЬКО 
//       ЧЕРЕДОВАТСЯ И УЖ НИ КАК НЕ ПОВТОРЯТСЯ ПО НЕСКОЛЬКО РАЗ ПОДРЯД
           {
            trade=true;
           }
  if(trade==true)
        {
         OpenPosition(Symbol(),OP_BUY,0.1,Ask-sl*Point,Ask+tp*Point);
         trade=false;
        }
}
        }
    
     
if(sell(pos)==true)
{
   if(!ExistPositions(Symbol(),-1,-1,0))
     {

      if(GetTypeLastClosePos(Symbol(),-1)!=OP_SELL)
        {
         trade2=true;
        }

      if(trade2==true)
        {
         OpenPosition(Symbol(),OP_SELL,0.1,Bid+sl*Point,Bid-tp*Point);
         trade=false;
      }
  }}
 }
  }

//возвращает истину если закрытие бара  с указаной позицией выше МА

bool buy(int pos)
  {
   if(iClose(Symbol(),0,pos)>MA.Main(1))
      return true;
   else
      return false;
  }
//+------------------------------------------------------------------+
//| возвращает истину если закрытие бара  с указаной позицией ниже МА
//+------------------------------------------------------------------+
bool sell(int pos)
  {
   if(iClose(Symbol(),0,pos)<MA.Main(1))
      return true;
   else return false;
  }
TODAS LAS FUNCIONES excepto las dos condiciones de compra y venta están tomadas de la rama de kim...... por favor dígame donde me equivoqué...necesito una transacción por intersección
 

otra pregunta sobre la función

/SetRectangle(clrBlue,"Прямоугольник",Time[10],Low[10],Time[0],High[0]);
//Если bk=true, то будет залит цветом, если false - то просто "рамка" ... sz при "просто рамка" - это ширина линий "рамки"
//

//+----------------------------------------------------------------------------+
void SetRectangle(color cl, string nm="", datetime t1=0, double p1=0, datetime t2=0, double p2=0, int sz=0, bool bk=true) {
   if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_RECTANGLE, 0, 0, 0, 0, 0);
   ObjectSet(nm, OBJPROP_TIME1   ,t1);
   ObjectSet(nm, OBJPROP_PRICE1  ,p1);
   ObjectSet(nm, OBJPROP_TIME2   ,t2);
   ObjectSet(nm, OBJPROP_PRICE2  ,p2);
   ObjectSet(nm, OBJPROP_COLOR   ,cl);
   ObjectSet(nm, OBJPROP_WIDTH   ,sz);
   ObjectSet(nm, OBJPROP_BACK    ,bk);
}

cómo hacer que un rectángulo se dibuje hacia adelante en lugar de hacia atrás, por ejemplo, cinco barras hacia adelante a un precio especificado...... y que no se vuelva a dibujar

 
artmedia70:

He echado un vistazo. Gracias.

Sin embargo, no hay mucha información en la pregunta. Hay muchos extremos en las barras horarias del mes. Y por cierto, ¿extremos de qué exactamente?


He asumido que sólo hay dos extremos mensuales, el mínimo y el máximo... Bueno, da igual, al principio era un código largo, por eso pedí ayuda... Pero entonces caí en la cuenta, y conseguí encajarlo en cuatro líneas.
 
Dígame, por favor. En la construcción por encima de 600. ¿Puede el corredor dar volúmenes reales?