Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Suche einen selten genutzten MQL Befehl! (http://www.expert-advisor.com/forum/showthread.php?t=4026)

Nap$ter 22.01.15 20:09

Suche einen selten genutzten MQL Befehl!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ahoi Zusammen. :)

Ich bin auf der Suche nach einem bestimmten MQL Befehl der vermutlich selten benutzt wird. Der MT4 hat wie jeder weiss eine Alert Funktion.
Bei dieser Alarm Funktion kann man sich auch anstatt sich einen Sound zu einem bestimmten xyz Wert auszugeben zu lassen, einen File öffnen lassen.
Also wenn z.b EURUSD Wert 1.555 erreicht hat wird anstatt eines Ton eine Datei geöffnet. Hier ein Schreenshot was ich meine.:
In diesem Fall wird der Editor geöffnet.

Screenshot by Lightshot

Ich suche diesen Befehl um ihn in einen Indikator einzubauen. Bei Alarm (Überkauft) wird eine Datei geöffnet und bei Alarm (Unterverkauft) wird eine andere Datei geöffnet. Habe mit dem Befehl "OpenFile" was probiert, aber bisher erfolglos..:confused:
Ich habe sowas mal in einem EA gesehen:

Screenshot by Lightshot

Hat jemand eine Idee wie dieser Befehl lautet oder wie ich ihn in einen Indikator bekomme?
Im Anhang ein einfacher Indikator zum testen in den ich sowas einbauen möchte.

Der Befehl mit Beispiel würde mir aber schon reichen.
Bin über jede Info dankbar.

traderdoc 22.01.15 20:41

Dieser Alarm Editor ist ein Tool des Terminals, der nach meinem Kenntnisstand mit keinem MQ4-Befehl gesteuert werden kann.
Die im MQ4 implementierte Alert()-Funktion gibt die Argumente in der Klammer durch Komma getrennt im Alertfenster aus. Diese Argumente könne Variablen der Typen String, Double, Float, Int, Bool, Color, Datetime usw. sein. Damit sind aber die Funktionen Deines Alert Editor nicht steuerbar.

Auch mit den Ausgabefunktionen Comment() und Print() ist das nicht zu machen,
was nicht bedeutet, dass man die Funktionalität dieses Alert Editor nicht auch auf andere Art und Weise programmieren kann.

Aber dieser Alarm Editor wird nur aus dem Terminal heraus einstellbar sein und nur dann einen entsprechenden Alert generieren, wenn die Situation im Chart gegeben sind. D.h. das wären Alert für das händische Traden und die o.g. drei Ausgabefunktionen für ein Programm. Das Alertfenster über Alert() wird dabei aber nicht!! im Strategietester angezeigt.

traderdoc

Nap$ter 22.01.15 21:06

Schonmal Danke für die ausführliche Erklärung.
Nur nochmal zur Verständnis: Ich möchte nicht den Alarm Editor des Termianls mit meinem Indikator ansprechen.

Der Indikator soll anstatt eine Message in der Alert Box wo dann z.B steht ( "USDCAD value +10 Überkauft sell") eine von mir eingestelle Datei öffnen. In einem EA ist dies umsetzbar.
Wie in dem 2ten Screenshot zu sehen.

Screenshot by Lightshot

Wollte mich sozusagen nur erkundigen ob dies auch in einem Indikator umsetzbar ist? Also deiner Meinung nach in einem Indikator nicht realisierbar, richtig?

Falls nicht muss ich dann wohl dies in einem EA versuchen zu realisieren. :)

markusrgb 22.01.15 22:52

nur weil ich da grad mal so drübergestolbert bin ...
evtl hilft dir ja das hier weiter:


File Functions - MQL4 Documentation

analog dazu evtl das hier:

auch mal das durchlesen:
Externe Handelssignale in der Forex Automation verwenden - FOREX TRADING 2015 MQL4 TUTORIAL DEUTSCH

:D

traderdoc 22.01.15 22:54

Natürlich kannst Du aus dem Indikator heraus eine Datei aufrufen und öffnen.

Nap$ter 23.01.15 01:18

Okay hatte ich wohl falsch verstanden.
Kannst du mir den Befehl nennen?
Zusammen mit einem Beispiel wäre super :)

pako 23.01.15 11:33

Liste der Anhänge anzeigen (Anzahl: 1)
Shell32.dll

Script notepad.ex4

traderdoc 23.01.15 12:17

FileOpen() und alle die mit File... beginnen sind dafür zuständig.

traderdoc

pako 23.01.15 13:07

Zitat:

Zitat von traderdoc (Beitrag 28364)
FileOpen() und alle die mit File... beginnen sind dafür zuständig.

traderdoc

:confused:
Beispiel
Code:

int filehandle=FileOpen("notepad.exe",FILE_WRITE|FILE_CSV);
:eek::confused:

traderdoc 23.01.15 16:03

Zitat:

Zitat von pako (Beitrag 28365)
:confused:
Beispiel
Code:

int filehandle=FileOpen("notepad.exe",FILE_WRITE|FILE_CSV);
:eek::confused:

Ne @pako, Dateiendung ist falsch und da er etwas aus der Datei auslesen möchte, wäre auch das FILE_WRITE falsch!

Wenn dann so:

int filehandle = FileOpen("Datei.csv", FILE_READ|FILE_CSV);
:)

traderdoc

pako 23.01.15 16:34

Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von traderdoc (Beitrag 28367)
Ne @pako, Dateiendung ist falsch und da er etwas aus der Datei auslesen möchte, wäre auch das FILE_WRITE falsch!

Wenn dann so:

int filehandle = FileOpen("Datei.csv", FILE_READ|FILE_CSV);
:)

traderdoc

Er will die *.exe Datei ausführen

traderdoc 23.01.15 16:40

Zitat:

Zitat von pako (Beitrag 28369)
Er will die *.exe Datei ausführen

Von *.exe hatte er in Post#1 nichts geschrieben. Und die *.csv war ein Beispiel.

traderdoc

Nap$ter 23.01.15 16:52

Liste der Anhänge anzeigen (Anzahl: 1)
Jap ich will eine *.exe Datei ausführen. Hatte ich im Post#1 vergessen sorry.
Und später vielleicht noch eine *.au3 Datei, aber diese wird vermutlich nicht gehen oder?

Kann jemand von euch diesen Befehl kurz in den Indikator mit rein reinschreiben, bin noch am Angfang mit der MQL Programmierung? :confused:

traderdoc 23.01.15 17:07

Das ist eben ganz wichtig, dass man sich eineindeutig ausdrückt und auch schreibt, was man will, sonst bekommt evtl. etwas anderes.

traderdoc

Nap$ter 23.01.15 17:17

Da gebe ich dir vollkommen recht. Dachte halt nur das die Screenshots ausreichen, da auf beiden Screen jeweils eine *.exe Datei geöffnet werden sollte.

Nap$ter 26.01.15 15:59

Liste der Anhänge anzeigen (Anzahl: 1)
So habe mich mal dran gemacht und versucht den Befehl in einen Indikator einzubauen. Leider funktioniert es nicht. Vermutlich irgendwo ein Fehler. Die "Test.exe" Datei ist im File Ordner des MT4's. Hab noch wenig Erfahrung mit dem Programieren von MQL. :confused:
Auszug aus dem Indikator:

Code:


#property copyright "Copyright © 2015 - R.ST"
#property link      ""

#property indicator_separate_window
#property indicator_minimum -35.0
#property indicator_maximum 35.0
#property indicator_buffers 5
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrDodgerBlue
#property indicator_color3 clrRed
#property indicator_color4 clrLime
#property indicator_level2 12.0
#property indicator_level3 -12.0
#property indicator_style1 2;

extern int period =4;
extern ENUM_MA_METHOD MaMethod=MODE_SMA;
extern ENUM_APPLIED_PRICE MaPrice = PRICE_MEDIAN;

extern int RSIPeriod=4;
extern ENUM_APPLIED_PRICE RsiPrice=PRICE_CLOSE;
extern double RsiOverBoughtLevel=90.0;
extern double RsiOverSoldLevel=10.0;

extern double Level =24.0;

extern bool  alertsOn        = true;
extern bool  alertsOnCurrent = true;
extern bool  alertsMessage  = true;
extern bool  alertsNotification = false;
extern bool  alertsSound    = false;
extern bool  alertsEmail    = false;
extern bool  filehandle      = true;

double AboveBuff[],ShortBuff[],LongBuff[],BelowBuff[];
double RSIBuffer[];

// ---
int init() {
  SetIndexBuffer(0, AboveBuff); SetIndexStyle(0, DRAW_HISTOGRAM, EMPTY, 2);                          // Lime Above 0
  SetIndexBuffer(1, BelowBuff); SetIndexStyle(1, DRAW_HISTOGRAM, EMPTY, 2);                          // Lime Below 0
  SetIndexBuffer(2, ShortBuff); SetIndexStyle(2, DRAW_ARROW, EMPTY, 2);      SetIndexArrow(2, 108); // Red
  SetIndexBuffer(3, LongBuff); SetIndexStyle(3, DRAW_ARROW, EMPTY, 2);      SetIndexArrow(3, 108); // Blue

  SetIndexLabel(0, "Above");
  SetIndexLabel(1, "Below"); 
  SetIndexLabel(2, "SHORT"); 
  SetIndexLabel(3, "LONG");
 
  SetIndexBuffer(4,RSIBuffer);
  SetIndexStyle(4,DRAW_NONE);
 
  SetLevelStyle(STYLE_DOT, 0, SteelBlue);

  IndicatorShortName(" Similar to Fx MTN + RSI ");
  return (0);
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
// ---
int deinit() {
 return(0);
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
// ---
int start() {

  int filehandle=FileOpen("Test.exe",FILE_WRITE|FILE_CSV);

  int counted_bars=IndicatorCounted();
      if(counted_bars<0) return(-1);
      if(counted_bars>0) counted_bars--;
          int limit=MathMin(Bars-counted_bars,Bars-1);
     
      for (int i = limit; i >=0; i--)
      {
        //double Temp = 0.0; for (int j = i; j < i + Per; j++) Temp += (High[j] + Low[j]) / 2.0;
        double Main =iMA(NULL,0,period,0,MaMethod,MaPrice,i) ;//Temp / Per;
              //  Temp = 0.0;  for (j = i; j < i + Per; j++) Temp += High[j] - Low[j];
        double Minr = 0.2 * iATR(NULL,0,period,i);//(Temp / Per);
       
            if (Minr!=0)
            {
              AboveBuff[i] = 3.0 * (High[i]  - Main) / Minr;
              BelowBuff[i] = 3.0 * (Low[i]  - Main) / Minr;
            }             
            ShortBuff[i] = EMPTY_VALUE;
            LongBuff[i] = EMPTY_VALUE;
            if (AboveBuff[i] >  Level) ShortBuff[i] =  Level+1;
            if (BelowBuff[i] < -Level) LongBuff[i] = -(Level+1);
        //rsi:
        RSIBuffer[i]=iRSI(NULL,0,RSIPeriod,RsiPrice,i);
      }
  manageAlerts();
  return(0);
}

//+-------------------------------------------------------------------
//|                                                                 
//+-------------------------------------------------------------------
void manageAlerts()
{
  if (alertsOn)
  {
      if (alertsOnCurrent)
          int whichBar = 0;
      else    whichBar = 1;
      if (ShortBuff[whichBar] != EMPTY_VALUE || LongBuff[whichBar] != EMPTY_VALUE)
      {
        if (ShortBuff[whichBar] !=  EMPTY_VALUE &&  GetRsiAlert(whichBar)==OP_SELL)doAlert(whichBar,"down + RSI overbougth @ Level " +RsiOverBoughtLevel);
        if (LongBuff[whichBar] !=  EMPTY_VALUE  && GetRsiAlert(whichBar)==OP_BUY) doAlert(whichBar,"up + RSI oversold @ Level " +RsiOverSoldLevel);
      }
  }
}

//
//
//
//
//

void doAlert(int forBar, string doWhat)
{
  static string  previousAlert="nothing";
  static datetime previousTime;
  string message;
 
  if (previousAlert != doWhat || previousTime != Time[forBar]) {
      previousAlert  = doWhat;
      previousTime  = Time[forBar];

      //
      //
      //
      //
      //

      message =  StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," SimilarFxMNT signal ",doWhat);
          if (alertsMessage) Alert(message);
          if (alertsEmail)  SendMail(StringConcatenate(Symbol()," SimilarFxMNT "),message);
          if (alertsNotification) SendNotification(message);
          if (alertsSound)  PlaySound("alert2.wav");
          if (filehandle)    FileOpen("Test.exe",FILE_READ|FILE_CSV);
         
  }
}

int GetRsiAlert(int AlertCandle) {
 if(RSIBuffer[AlertCandle+1]<RsiOverBoughtLevel && RSIBuffer[AlertCandle]>RsiOverBoughtLevel) return(OP_SELL);//RSI RsiOverBoughtLevel
 if(RSIBuffer[AlertCandle+1]>RsiOverSoldLevel && RSIBuffer[AlertCandle]<RsiOverSoldLevel) return(OP_BUY);//RSI RsiOverSoldLevel
 return(99);//nothing
}

Leider wird beim Alarm die "Test.exe" nicht geöffnet...
Indikator im Anhang. Wäre cool von euch wenn sich jemand diesen mal kurz anschaut und die Fehler beseitigt. :)

pako 26.01.15 17:22

Zitat:

Zitat von Nap$ter (Beitrag 28397)
So habe mich mal dran gemacht und versucht den Befehl in einen Indikator einzubauen. Leider funktioniert es nicht. Vermutlich irgendwo ein Fehler. Die "Test.exe" Datei ist im File Ordner des MT4's. Hab noch wenig Erfahrung mit dem Programieren von MQL. :confused:


Leider wird beim Alarm die "Test.exe" nicht geöffnet...
Indikator im Anhang. Wäre cool von euch wenn sich jemand diesen mal kurz anschaut und die Fehler beseitigt. :)

Paht "Test.exe" ???

Nap$ter 26.01.15 18:01

Zitat:

Zitat von pako (Beitrag 28400)
Paht "Test.exe" ???

Ich habe eine Test.exe geschrieben zum testen oder was meinst du? Fände es cool wenn du mir den Fehler korrieren könntest, hab wenig erfahrung mit MQL. :confused:

pako 26.01.15 18:09

Zitat:

Zitat von Nap$ter (Beitrag 28403)
Ich habe eine Test.exe geschrieben zum testen oder was meinst du? Fände es cool wenn du mir den Fehler korrieren könntest, hab wenig erfahrung mit MQL. :confused:

adress von "Test.exe"???

zum Beispiel - C:\Program Files (x86)\MetaTrader 4 Terminal\MQL4\Files\Test.exe

pako 26.01.15 18:20

Code:

//+------------------------------------------------------------------+
//|                                          Check_TerminalPaths.mq4 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version  "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
  Print("TERMINAL_PATH = ",TerminalInfoString(TERMINAL_PATH));
  Print("TERMINAL_DATA_PATH = ",TerminalInfoString(TERMINAL_DATA_PATH));
  Print("TERMINAL_COMMONDATA_PATH = ",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
  }


Nap$ter 26.01.15 18:20

Ah so okay du meinst die Adresse der Datei.
Zurzeit: c:\ea\Test.exe

Oder muss die in den besagten Ordner den du erwähnst?
Mittlerweile werden ja die Dateien/Indikatoren beim Metatrader in Profile gespeichert.

pako 26.01.15 18:32

Liste der Anhänge anzeigen (Anzahl: 1)
eingebaut

C:\ea\Test.exe

Import von DLLs zulassen

pako 26.01.15 18:58

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Nap$ter 26.01.15 19:04

Zitat:

Zitat von pako (Beitrag 28408)
eingebaut

C:\ea\Test.exe

Import von DLLs zulassen

Cool danke das sieht schonmal gut aus. Kannst du noch 2 Variablen dazu packen, das ich den Pfad ändern kann und sozusagen eine Datei bei überkauft auswählen und eine bei Unterverkauft?
Wie hier der Screenshot vom Anfang.
Screenshot by Lightshot

Zurzeit öffnet er ja nur die besagte Testdatei, egal ob überkauft oder überverkauft. Muss jeweils eine andere öffnen können.

Falls nicht wäre es cool wenn du mir die mql auch hochladen könntest damit ich selber versuchen kann dies umzusetzten und auch den Pfad ändern könnte :)

pako 26.01.15 19:24

Code:


void manageAlerts()
  {
  if(alertsOn)
    {
      if(alertsOnCurrent)
        int whichBar=0;
      else    whichBar=1;
      if(ShortBuff[whichBar]!=EMPTY_VALUE || LongBuff[whichBar]!=EMPTY_VALUE)
        {
        if(ShortBuff[whichBar]!=EMPTY_VALUE&&GetRsiAlert(whichBar)==OP_SELL) ---> Path1???

        if(LongBuff[whichBar] !=EMPTY_VALUE&&GetRsiAlert(whichBar)==OP_BUY)---> Path2???
        }
    }
  }

Durch welche exe-Dateien soll ich das rote ersetzen?

zum Beispiel - Path1 ---> C:\ea\Test1.exe
Path2 ---> C:\ea\Test2.exe

Nap$ter 26.01.15 20:08

Also zum Beispiel:
Path1 --> c:\ea\eurusd_sell.exe
Path2 --> c:\ea\eurusd_buy.exe

Gut wäre es wenn ich den Pfad selber im Indikator einstellen könnte, so wie auf dem Screenshot:
Screenshot by Lightshot

Am einfachsten wäre es wenn du mir die MQL Datei hochlädst dann kann ich mir die Pfade selber einstellen.
Brauche dies für mehrere Währungspaare mit variierenden Pfaden/Bezeichnungen.

pako 26.01.15 20:41

Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Nap$ter (Beitrag 28419)
Also zum Beispiel:
Path1 --> c:\ea\eurusd_sell.exe
Path2 --> c:\ea\eurusd_buy.exe

Gut wäre es wenn ich den Pfad selber im Indikator einstellen könnte, so wie auf dem Screenshot:
Screenshot by Lightshot

Am einfachsten wäre es wenn du mir die MQL Datei hochlädst dann kann ich mir die Pfade selber einstellen.
Brauche dies für mehrere Währungspaare mit variierenden Pfaden/Bezeichnungen.

eingebaut


Am einfachsten wäre EA schreiben iCustom - MQL4 Documentation
wenn von "Indi" signal buy, ---> EA --->BUY
wenn von "Indi" signal sell, ---> EA --->SELL

Rob 10.02.17 23:41

Hallo zusammen,
auch wenn es schon etwas her ist würde ich hier gerne das Thema noch einmal aufgreifen.

Ich möchte eine Datei z.B. ".au3" in einem EA ausführen. Könnt Ihr den Programmschnipsel posten, womit das möglich ist? Leider kann man die .ex4 nicht öffnen um nachzuschauen. Wäre echt klasse :).


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:24 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum