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

 
Leo59:

Necesito el CÓDIGO INICIAL del indicador técnico IMA, el indicador que se llama en el terminal MetaTrader4 en la pestaña "Indicadores -> Tendencias -> Media Móvil".

¿Está más claro ahora?

¿Por qué reinventar la rueda?

Hazlo como OsMA o cualquier otro código:

//+------------------------------------------------------------------+
//| Moving Average of Oscillator                                     |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const datetime& time[],
                 const double& open[],
                 const double& high[],
                 const double& low[],
                 const double& close[],
                 const long& tick_volume[],
                 const long& volume[],
                 const int& spread[])
  {
   int i,limit;
//---
   if(rates_total<=InpSignalSMA || !ExtParameters)
      return(0);
//--- last counted bar will be recounted
   limit=rates_total-prev_calculated;
   if(prev_calculated>0)
      limit++;
//--- macd counted in the 1-st buffer
   for(i=0; i<limit; i++)
      ExtMacdBuffer[i]=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i)-
                    iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//--- signal line counted in the 2-nd buffer
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- main loop
   for(i=0; i<limit; i++)
      ExtOsmaBuffer[i]=ExtMacdBuffer[i]-ExtSignalBuffer[i];
//--- done
   return(0);
  }
//+------------------------------------------------------------------+

¿O acaso no confía categóricamente en Metaquotes?

 

Hola a todos. He publicado un script en la página 943 sobre la descripción del trabajo y ejemplos de bibliotecas *dll. He averiguado un poco por qué no funciona el script.

1. #include<WinUser32.mqh> no es necesario en este caso.

2. Condición por separado if(lastkey != 0) Alert("lastkey=",lastkey); emite correctamente y de forma estable el código de la tecla pulsada. Si haces un retraso, no hay duda de cómo funciona.

3. Condición por separado if(lastmouse != 0) Alert("lastmouse=",lastmouse); emite establemente 512, incluso si el ratón no se mueve. Es muy raro que aparezcan otros números

En respuesta a la pulsación de los botones del ratón.

4. if(lastwnd != 0) Alert("lastwnd=",lastwnd); devuelve una cadena vacía, probablemente porque la biblioteca es antigua, no Unicode.

En la ayuda, lee que el editor puede trabajar con bibliotecas *dll, sólo tienes que arrastrar y soltar en la ventana del editor. No se abre.

Pregunta. ¿Alguien puede ayudar a corregir "IdleLib.dll" o mejor por dinero. Si en algún lugar hay este tema(y otros *dll) mostrar el enlace.

 
Por favor, aconsejar cómo prohibir AutoTrading en mi EA (después de algún evento), es decir, para establecer el botón deAutoTradingterminalpara prohibir. He intentado llamar a la constante ACCOUNT_TRADE_ALLOWED y cambiar su valor a false, pero el compilador dice que esto no tendrá ningún efecto ( ACCOUNT_TRADE_ALLOWED == false; //la expresión no tiene efecto)
 
Prueba esto


#import "user32.dll"
int GetForegroundWindow();
int  PostMessageW(int  hWnd, int  Msg, int  wParam, string lParam);
#import
#define  WM_COMMAND                    0x0111

после определенного события PostMessageW(GetForegroundWindow(), WM_COMMAND, 33020, (string) 0);
 
amavladi:
Por favor, aconsejar cómo prescribir (después de un cierto evento) una prohibición de AutoTrading en un EA, es decir, para establecer programáticamente botón deAutoTrading terminalpara prohibir. He intentado llamar a la constante ACCOUNT_TRADE_ALLOWED y cambiar su valor a false, pero el compilador dice que esto no tendrá ningún efecto ( ACCOUNT_TRADE_ALLOWED == false; //la expresión no tiene efecto)

Esta tarea (prohibir que el EA opere) se resuelve muy fácilmente con semáforos (true/false.... allow/disallow trading).

¿O es importante pulsar el botón "Auto Trade"?

 
charter:

Esta tarea (prohibir que el EA opere) se resuelve muy fácilmente con semáforos (true/false.... allow/disallow trading).

¿O es tan importante pulsar el botón "AutoTrading"?

Si no puedo desactivarel AutoTrading para todo el terminal, por supuesto que lo haré. El asunto es que tengo varios Expert Advisors funcionando en mi terminal y

Quiero utilizar un EA separado para controlar la equidad y desactivar el AutoTrading para todos los EAs simultáneamente en caso de emergencia, por ejemplo, cuando Aquity se reduce en un 50%

 
amavladi:

Si no puedo prohibirel AutoTrading para todo el terminal, seguramente lo haré. El caso es que tengo varios Expert Advisors funcionando en mi terminal y

Quería utilizar un EA para controlar el beneficio de la cuenta y desactivar el AutoTrading para todos los EAs al mismo tiempo en caso de emergencia, por ejemplo, cuando el beneficio de la cuenta cae en un 50%.

No lo he comprobado ni un poco. Tienes que sustituir WinUser32.mqh por el adjunto para que funcione.

Comprobado ahora, funciona. Y aquí hay más trucos

#include <WinUser32.mqh>

void OnTick()
{
 после определенного события wCommands(20); 
}

void wCommands(int com)
{
switch(com)
{
case  1:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33137, (string)0); return; //M1 |
case  2:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33138, (string)0); return; //M5 |
case  3:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33139, (string)0); return; //M15 |
case  4:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33140, (string)0); return; //M30 |
case  5:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33135, (string)0); return; //H1 |
case  6:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33136, (string)0); return; //H4 |
case  7:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33134, (string)0); return; //D1 |
case  8:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33141, (string)0); return; //W1 |
case  9:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33334, (string)0); return; //MN |
case 10:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33050, (string)0); return; //Удалить эксперт |
case 11:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 35426, (string)0); return; //Удалить скрипт |
case 12:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 57602, (string)0); return; //Закрыть окно текушего графика |
                                                                           57604              //Сохранить как
                                                                           57607              //Вызов диспетчера печати
                                                                           57608              //Печать графика
                                                                           57609              //Предварительный просмотр
case 13:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33048, (string)0); return; //Вызов свойств экстерта |
case 14:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33157, (string)0); return; //Вызов свойств графика |
case 15:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33025, (string)0); return; //Увеличение масштаба |
case 16:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33026, (string)0); return; //Уменьшение масштаба |
case 17:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33018, (string)0); return; //Переключение на бары |
case 18:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33019, (string)0); return; //Переключение на свечи |
case 19:        PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33022, (string)0); return; //Переключение на линию |

case 20:        PostMessageA(GetForegroundWindow(), WM_COMMAND, 33020, (string)0); return; //Переключение кнопки советника |
case 21:        PostMessageA(GetForegroundWindow(), WM_COMMAND, 35429, (string)0); return; //Окно логина и пароля |
case 22:        PostMessageA(GetForegroundWindow(), WM_COMMAND, 37400, (string)0); return; //Пересканировать сервера |
case 23:        PostMessageA(GetForegroundWindow(), WM_COMMAND, 35403, (string)0); return; //Глобальные переменные |
case 24:        PostMessageA(GetForegroundWindow(), WM_COMMAND, 35419, (string)0); return; //Список индикаторов |
case 25:        PostMessageA(GetForegroundWindow(), WM_COMMAND, 33265, (string)0); return; //Открывает окно настройки |
case 26:        PostMessageA(GetForegroundWindow(), WM_COMMAND, 33262, (string)0); return; //Архив катировак |
case 27:        PostMessageA(GetForegroundWindow(), WM_COMMAND, 33309, (string)0); return; //Обзор рынка |
case 28:        PostMessageA(GetForegroundWindow(), WM_COMMAND, 33310, (string)0); return; //Навигатор |
case 29:        PostMessageA(GetForegroundWindow(), WM_COMMAND, 33314, (string)0); return; //Терминал |
case 30:        PostMessageA(GetForegroundWindow(), WM_COMMAND, 33315, (string)0); return; //Тестер стратегий |
}
}


Y he corregido el post anterior para que funcione sin sustituir WinUser32.mqh

Archivos adjuntos:
winuser32.mqh  71 kb
 

Saludos a todos... Sé que el problema es el siguiente. Cuando compilo el código, la variable d toma el valor 110 y el indicador muestra todo correctamente, pero con la llegada de una nueva barra, la variable se convierte en 109 y, en consecuencia, jode completamente todas las lecturas del indicador. Ya he jodido ..... Qué carajo????

int start()
  {
  int limit,Val,Oi;
  
   drawonce();
//limit=Bars;
if (b!=Bars){
b=Bars;
datetime ldt_BeginDay = iTime (NULL, PERIOD_D1,Q); 
int li_Bar = iBarShift (NULL, 0, ldt_BeginDay);
d=0;

 for(int i=li_Bar-10; i>=0; i--){  
 
 
if (curDay!=TimeDay(Time[i])) {

curDay=TimeDay(Time[i]);
OOO=iClose(NULL,PERIOD_D1,Q-d+1)-iOpen(NULL,PERIOD_D1,Q-d+1);
if (volarr[Q-d]!=0) Val=volarr[Q-d]-volarr[Q-d+1];
if (oiarr[Q-d]!=0)  Oi=oiarr[Q-d]-oiarr[Q-d+1];
d++;
}
Buffer1[i]=Val;
Buffer2[i]=Oi;
Buffer3[i]=OOO;

}   
   
   
}
   
   WindowRedraw();
   Comment(Q,"   ",d);
   return(0);
  }

Por qué durante la compilación un valor es variable, pero con la llegada de una nueva barra la variable cambia?????

 
Bueno..... en mi caso incluso los profesionales sin fuerte????
 
¿Puede alguien explicar la diferencia entre la compilación y la llegada de un nuevo bar????