Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4
Startseite Registrieren Hilfe Community Kalender Heutige Beiträge Suchen

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4978
Beiträge: 43260
Benutzer: 7.224
Aktive Benutzer: 74
Links: 84
Wir begrüßen unseren neuesten Benutzer: Sundaytrader
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einer Stunde
- Sundaytrad...
vor 8 Stunden
- TS_6
vor 2 Tagen
- Mane
vor 2 Wochen
- AlbertZiz
vor 2 Wochen
- michak

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 363
Gesamt: 363
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 11.07.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 10
McMenneman befindet sich auf einem aufstrebenden Ast
Standard Mehrere EAs auf einem Konto

Moin Zusammen,
also folgende Fragestellung:
Ich trade zb. 3 versch. EAs auf einem Konto. Jeder EA darf/soll max. 1 Order eröffnen können. Dafür habe ich bei allen jeweils eine Abfrage Orderlots()<1 eingebaut.
Wie ich das jetzt im Trading sehe, heisst das ja im Endeffekt, wer zuerst kommt malt zuerst - also EA1 eröffnet eine Position und damit sind EA2-3 blockiert bis diese Position geschlossen wird.
Meine Idee wäre das mit der Abfrage nach der MagicNum oder einem Comment oder so zu umgehen...
Ist das so richtig gedacht? Und wie löst bzw. habt ihr solche Probleme behoben?

Oder gibt es dazu schon einen Thread?

Gruss
  #2 (permalink)  
Alt 11.07.17
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Bereits mehrmals gepostet:

Code:
void CheckOrders() {
   BuyOrder = false; SellOrder = false;
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
            if (OrderType() == OP_BUY)  BuyOrder = true;
            if (OrderType() == OP_SELL) SellOrder = true;
         }
      }
   }
}
Und dann wird BuyOrder bzw. SellOrder ausgewertet, ob true oder false.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #3 (permalink)  
Alt 11.07.17
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von McMenneman Beitrag anzeigen
Orderlots()<1
Sollte wohl OrdersTotal() heißen.
Du könntest das von Traderdoc gepostete verwenden. Wenn du allerdings einfach nur umgehen willst, das EA2-3 blockiert werden, so darfst du halt nicht
abfragen, ob OrdersTotal()<1 ist, sondern fragst einfach ab, ob es schon eine Order vom entsprechenden EA gibt (MagicN.).
Code:
bool orderset = false;
for(int i=OrdersTotal()-1; i>=0; i--)
{
   if(OrderSelect(i,SELECT_BY_POS))
   {
      if(OrderMagicNumber() == DEINE_MAGIC_NUMBER)
         orderset = true;
   }
}
  #4 (permalink)  
Alt 12.07.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 10
McMenneman befindet sich auf einem aufstrebenden Ast
Red face

Schaut mal was ich da jetzt gebaut habe...
läuft auf den DAX_1min
1) EA soll eine Stoporder platzieren und zwar pro neuer Minute/Candle eine neue, respektive im aktuellen Fall zb. auf das High[1]+6
2) wurde Stop nicht getriggert soll er nach 1min/Candle gestrichen werden
3) Insgesamt soll es so sein das bestehende Orders im Account zb. diskritionäre oder durch andere EAs nicht beachtet werden.

PHP-Code:
int OrderNumber;
int BarsSinceEntry;

bool IsNewCandle()
{
   static 
int BarsOnChart=0// static Var. wird nur ein mal gesetzt und ist nur in der Function sichtbar = Local Variable
   
if(Bars == BarsOnChart)
   return(
false);
   
BarsOnChart Bars;
   return(
true);
}

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
 
//---
   
return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
//Überprüfung ob neue Candle vorliegt 
  
if(IsNewCandle()){

//check bzgl Order des EAs
  
bool orderset false;
   for(
int i=OrdersTotal()-1i>=0i--)
   {
   if(
OrderSelect(i,SELECT_BY_POS))
   {
      if(
OrderMagicNumber() == 202 )
         
orderset true;
   }
 }

//simple Test Order die einfach platziert bei Neuer Candle platziert werden soll => und Streichung der vorherigen StopOrder
   
if(orderset=true)
   {
      if (
0<1//Bedingung Hauptsache es geht die Order raus
      
{
         
OrderNumber OrderSend(Symbol(), OP_BUYSTOP,0.1,High[1]+65,125000,"Test",202,TimeCurrent()+660,Blue);
         
BarsSinceEntry=TimeCurrent();
      }
   }


//pending Orders streichen         
 
if (BarsSinceEntry && TimeCurrent() > BarsSinceEntry PeriodSeconds(PERIOD_CURRENT)) {
   for (
int i OrdersTotal()-1>= 0i--) {
      if (
OrderSelect(iSELECT_BY_POSMODE_TRADES)) {
         if (
OrderSymbol() == Symbol() && OrderMagicNumber() == 202) {
            if (
OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) {
               
bool res OrderDelete(OrderTicket());
               if (
resBarsSinceEntry 0;
               break;
               Print(
GetLastError());
            }
         }
      }
   }
}   
         

 
         } 
  
}
//+------------------------------------------------------------------+ 
Wenn ich es so mache platziert der EA "ca."? jede neue Minute eine neue StpOrder , streicht aber die vorherige nicht.

Wie gesagt, bin noch ganz am Anfang...was mache ich falsch!?
  #5 (permalink)  
Alt 12.07.17
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Code:
//simple Test Order die einfach platziert bei Neuer Candle platziert werden soll => und Streichung der vorherigen StopOrder
if(orderset=true)
{
   if (0<1) //Bedingung Hauptsache es geht die Order raus
   {
      OrderNumber = OrderSend(Symbol(), OP_BUYSTOP,0.1,High[1]+6, 5,12500, 0,"Test",202,TimeCurrent()+660,Blue);
      BarsSinceEntry=TimeCurrent();
   }
}
1. Oben musst du 2 Gleichheitszeichen setzen (orderset == true), oder einfach (orderset). So wie du es hast, weist du der Variablen den Wert "true" zu.
2. Erst willst du pro EA nur eine Order und jetzt setzt du immer eine neue, wenn orderset == true, also wenn schon eine Order von diesem EA vorhanden ist?
3. Die zweite If-Bedingung ist sinnlos. Wieso hast du sie drinne?
4. Wenn du als Preis den Höchstkurs mit 6 addierst, kann es nicht vernünftig werden. Rate mal was passiert, wenn du zu einer Gleitpunktzahl 6 addierst (z.B. 1.12345 + 6).

Code:
if (BarsSinceEntry > 0 && TimeCurrent() > BarsSinceEntry + PeriodSeconds(PERIOD_CURRENT))
Übersetztes, freies Beispiel:
1000 > 0 && 1060 > 1060
Na, wo liegt der Fehler? Warum 1060 > 1060? Weil du in der if davor (if(orderset=true)) immer BarsSinceEntry auf TimeCurrent() setzt.
Sofern zwischen diesen beiden Codeblöcken nicht mindestens 1 Sekunde vergangen ist, so ist TimeCurrent() nie größer als BarsSinceEntry.
Außerdem erübrigt sich an paar Stellen auch eine Abfrage, weil du in den ganzen Codeblock ja erst mit der nächsten Kerze kommst.

Code:
bool res = OrderDelete(OrderTicket());
if (res) BarsSinceEntry = 0;
break;
Print(GetLastError());
GetLastError() wird hier nie aufgerufen, da du jedesmal vorher mit break abbrichst.

Geändert von next user (12.07.17 um 14:52 Uhr)
  #6 (permalink)  
Alt 12.07.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 10
McMenneman befindet sich auf einem aufstrebenden Ast
Standard

Danke next user!

Der EA soll erst mal auf den DAX laufen - kein Forex. Daher passt das schon mit dem Punkten. Aber sicherlich ist es sauberer auch hier auf Ticks/Pips umzustellen.

Verstehe ich das richtig, das wenn hier:
PHP-Code:
//simple Test Order die einfach platziert bei Neuer Candle platziert werden soll => und Streichung der vorherigen StopOrder
   
if(orderset==true)
   {        
         
OrderNumber OrderSend(Symbol(), OP_BUYSTOP,0.1,High[1]+65,125400,"Test",202,TimeCurrent()+660,Blue);
         
BarsSinceEntry=TimeCurrent();     
   } 
orderset == true steht, das DANN, bei keine Trades erfolgen!

orderset == false steht, das Dann immer Trades geschickt werden, egal ob schon Orders von anderen EAs gefilled wurden und pending sind!? Korrekt???


Bzgl. des Orderstreichens über BarsSinceEntry wie ich es habe klappt aber super!???
  #7 (permalink)  
Alt 12.07.17
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von McMenneman Beitrag anzeigen
Der EA soll erst mal auf den DAX laufen - kein Forex. Daher passt das schon mit dem Punkten.
Gut, ich sehe Code immer erst im "Allgemeinen" an, daher der Hinweis.
Zitat:
Zitat von McMenneman Beitrag anzeigen
orderset == true steht, das DANN, bei keine Trades erfolgen!

orderset == false steht, das Dann immer Trades geschickt werden, egal ob schon Orders von anderen EAs gefilled wurden und pending sind!? Korrekt???
Nein. Wenn orderset == true, so gibt es schon eine Order. Bei deiner if-Abfrage erstellst du aber eine neue Order, wenn orderset == true.
Bei orderset == false werden keine neuen Orders gesetzt.
Zitat:
Zitat von McMenneman Beitrag anzeigen
Bzgl. des Orderstreichens über BarsSinceEntry wie ich es habe klappt aber super!???
Du hast doch eben gesagt, das er die Order nicht löscht.

Muss kurz weg. Bin in'ner Stunde wieder da.
  #8 (permalink)  
Alt 12.07.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 10
McMenneman befindet sich auf einem aufstrebenden Ast
Standard

Also ich habe es live neben dran laufen!
Nur wenn ich es so eingebe, laufen mit zwei EAs trades!
Mit ==false , jeweils in jedem EA

PHP-Code:
void OnTick()
  {
 
//Überprüfung ob neue Candle vorliegt 
  
if(IsNewCandle()){

//check bzgl Order des EAs
  
bool orderset false;
   for(
int i=OrdersTotal()-1i>=0i--)
   {
   if(
OrderSelect(i,SELECT_BY_POS))
   {
      if(
OrderMagicNumber() == 333 )
         
orderset true;
   }
 }

//simple Test Order die einfach platziert bei Neuer Candle platziert werden soll => und Streichung der vorherigen StopOrder
   
if(orderset==false)
   {        
         
OrderNumber OrderSend(Symbol(), OP_BUYSTOP,0.1,High[1]+65,125400,"Tester",333,TimeCurrent()+660,Blue);
         Print(
GetLastError());
         
BarsSinceEntry=TimeCurrent();     
   } 
  #9 (permalink)  
Alt 12.07.17
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von McMenneman Beitrag anzeigen
Also ich habe es live neben dran laufen!
Nur wenn ich es so eingebe, laufen mit zwei EAs trades!
Mit ==false , jeweils in jedem EA
Ja, so ist es ja auch gedacht. Dein vorheriger Code:
Code:
bool orderset = false;

for(int i=OrdersTotal()-1; i>=0; i--)
{
   if(OrderSelect(i,SELECT_BY_POS))
   {
      if(OrderMagicNumber() == 202 )
         orderset = true;
   }
}

//simple Test Order die einfach platziert bei Neuer Candle platziert werden soll => und Streichung der vorherigen StopOrder
if(orderset=true)
{
   if (0<1) //Bedingung Hauptsache es geht die Order raus
   {
      OrderNumber = OrderSend(Symbol(), OP_BUYSTOP,0.1,High[1]+6, 5,12500, 0,"Test",202,TimeCurrent()+660,Blue);
      BarsSinceEntry=TimeCurrent();
   }
}
In der Orderabfrage stellst du orderset auf tru, wenn bereits eine Order vom EA vorhanden ist.
Im nächsten Teil fragst du aber ab, ob orderset == true ist und eröffnest in dem Fall eine weitere Order.
Bei dem, was du bisher geschrieben hast, soll eine Order ja nur gesetzt werden, wenn noch keine vom EA vorhanden ist.
In dem Fall musst du abfragen, ob orderset == false.
  #10 (permalink)  
Alt 12.07.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 10
McMenneman befindet sich auf einem aufstrebenden Ast
Smile

Funktioniert soweit erst mal Prima!

Danke dafür...

Nächste Frage kommt bestimmt...so long....nice trades!
Thema geschlossen

Lesezeichen

Stichworte
ea, expert advisor, mehrere ea, mehrere expert advisor, mql4, programmierung, programmierung metatrader, programmierung mql4


Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 20:18 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------