Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 135
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
¿Pones los precios de una vez o los obtienes y luego los pones en el cálculo?
¿Se fijan los precios de una vez, o se obtienen y luego se pegan en el cálculo?
for(int i=1; i<=periodo; i++)
{
H1_Close[i]=Close[k];
k--;
}
Tomo un trozo de timesession igual al periodo que empieza desde la última barra cerrada y lo volteo en el array, porque 1 es la penúltima barra en timesession y el cálculo debe empezar desde i-ésima
Es decir, mi función debería devolver el valor SMMA de la última barra cerrada.
El código siguiente codifica una idea sencilla.
Si la última orden cerrada fue en SEL
Si la última orden cerrada estaba en la NEL
Abrir una orden NEL
if ( OrderType ()==OP_SELL)
X = OrderProfit( );
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))
if ( OrderType ()==OP_BUY)
if(X < 0)
OrderSend(Symbol(),OP_SELL,0.1,Bid ,3,Ask+400*Point,Ask-200*Point,"17-10",123 );
PREGUNTA
¿Qué construcción del lenguaje se puede utilizar para añadir dos condiciones más a este código (marcado en rojo)?
Si la última orden cerrada es NEL
Si la última orden CEL se cerró
Si la última orden cerrada se ha cerrado en la NEL
Si la última orden cerrada se ha cerrado en unSL
Graciaspor su ayuda.
Te agradecería mucho que escribieras el código y no te limitaras a explicar lo que hay que hacer.
Hola. Estoy escribiendo un script para eliminar todas las órdenes pendientes. Sin embargo, sólo borra una orden. Siempre tengo dos órdenes pendientes o una. En cualquiera de los dos casos sólo se borra una Buy Stop. Para eliminar el Sell Stop hay que volver a ejecutar el script, siempre que no haya otras órdenes de Buy Stop. Por favor, indique dónde se encuentra el error.
cambiar la dirección de la búsqueda for(i=total-1;i>=0;i--)
Gracias, ahora funciona. ¿Entiendo correctamente que cuando se elimina una orden con índice 0, se le asigna el índice 0 a una orden con índice 1, y en la siguiente iteración i == 1, y no aparece dicha orden. ¿Puede decir si este es el caso?
Hay una función de fractal personalizable, bueno, eso es muy pesado. He dejado el dibujo de los objetos sólo para mostrar visualmente si los fractales se están formando correctamente - no va a suceder.
Pregunta: cómo podemos facilitarlo, porque las pruebas visuales son estúpidas:
extern int FrRight=5; // Баров справа
//-----------------------------------------------------------------------------------------------
void OnTick()
{
int nFrUp= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_UPPER); // Возвращает номер бара
int nFrDn= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_LOWER); // Возвращает номер бара
double FrHigh = High[nFrUp]; // Цена верхнего фрактала
double FrLow = Low [nFrDn]; // Цена нижнего фрактала
SetArrow("FrUp"+"_"+(string)Time[nFrUp], Time[nFrUp], High[nFrUp], clrDeepSkyBlue, 217, 2, ANCHOR_BOTTOM);
SetArrow("FrDn"+"_"+(string)Time[nFrDn], Time[nFrDn], Low[nFrDn], clrDeepPink, 218, 2, ANCHOR_TOP);
// Comment("Price: ",FrHigh,", Num: ",nFrUp,"\nPrice: ",FrLow,", Num: ",nFrDn);
}
//----------------------------------------------------------------------------------------------+
//---------------------- Возвращает номер бара фрактала (настраиваемый) ------------------------+
//----------------------------------------------------------------------------------------------+
int GetBarFractal(string symb,ENUM_TIMEFRAMES tf=0,int nLeft=2,int nRight=2,int numFr=0,int mode=MODE_UPPER) {
int i=0,cn=0,pos=0,r=0,l=0,e=0,equals,bars;
double _high[], _low[];
nLeft=nLeft<=2?2:nLeft;
nRight=nRight<=2?2:nRight;
equals=nLeft+nRight;
bars=Bars(symb,tf)-equals;
ArraySetAsSeries(_high,true);
ArraySetAsSeries(_low,true);
for(pos=nRight+1; pos<bars; pos++) {
r=nRight;
if(mode==MODE_UPPER) {
CopyHigh(symb,tf,0,pos+equals+1,_high);
for(i=1; i<=r; i++) {
if(_high[pos]<=_high[pos-i]) break;
}}
if(mode==MODE_LOWER) {
CopyLow(symb,tf,0,pos+equals+1,_low);
for(i=1; i<=r; i++) {
if(_low[pos]>=_low[pos-i]) break;
}}
//--
if(i==r+1) {
l=nLeft;
e=equals;
for(int j=1; j<=l+equals; j++) {
if(mode==MODE_UPPER) {
if(_high[pos]<_high[pos+j]) break;
if(_high[pos]>_high[pos+j]) l--;
if(_high[pos]==_high[pos+j]) e--;
}
if(mode==MODE_LOWER) {
if(_low[pos]>_low[pos+j]) break;
if(_low[pos]<_low[pos+j]) l--;
if(_low[pos]==_low[pos+j]) e--;
}
if(l==0) {
cn++;
if(cn>numFr) return(pos);
}
//--
if(e<0) break;
}}
}
Print(__FUNCTION__": Фрактал не найден");
return(0);
}
//----------------------------------------------------------------------------------------------+
//------------------- Функция рисования значка на графике, объект OBJ_ARROW --------------------+
//----------------------------------------------------------------------------------------------+
void SetArrow(string nm="", datetime t1=0, double p1=0, color col=clrRed,
int code=252, int width=1, int anchor=0) {
if(ObjectFind(0,nm)==-1) {
ObjectCreate(0,nm,OBJ_ARROW,0,0,0);
ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
ObjectSetInteger(0,nm,OBJPROP_ARROWCODE,code);
ObjectSetInteger(0,nm,OBJPROP_ANCHOR,anchor);
ObjectSetInteger(0,nm,OBJPROP_WIDTH,width);
ObjectSetInteger(0,nm,OBJPROP_SELECTED,false);
ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
ObjectSetDouble(0,nm,OBJPROP_PRICE,p1);
ObjectSetInteger(0,nm,OBJPROP_TIME,t1);
}
}
Gracias.
Hay una función de fractal personalizable, bueno, eso es muy pesado. He dejado el dibujo de los objetos sólo para mostrar visualmente si los fractales se están formando correctamente - no estará allí.
Pregunta: cómo puedo hacerlo más fácil, porque es estúpido probarlo visualmente:
Gracias.
Hola. ¿Podría aconsejar a un recién llegado?
He aquí un ejemplo:
si(Condición1)
si(Condición2)
{
}
si no
{
}
Según el código, Else debe referirse a if(condition1) y se ejecutará si no se cumple la condición1
Pero en realidad también se ejecutará si no se cumple la Condición2.
Hola. ¿Podría aconsejar a un recién llegado?
He aquí un ejemplo:
si(Condición1)
si(Condición2)
{
}
si no
{
}
Según el código, Else debe referirse a if(condition1) y se ejecutará si no se cumple la condición1
Pero en realidad se ejecutará si la Condición2 no se cumple.
Acostúmbrate a poner los frenos rizados inmediatamente con la condición
si(Condición)
{
}
A de acuerdo con su pregunta
{
if(Условие2)
{
}
}
else
{
}