Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 1100

 

Liebe Programmierer, können Sie mir bitte helfen, ein Verbot für die Eröffnung von mehr als einer Serie von Geschäften auf einmal (Serie ist, wenn der Auftrag in den Verlust oder Null geschlossen und öffnet dann das nächste Geschäft auf dem gleichen Instrument, aber mit einer größeren Menge), das heißt, wenn Sie eine Serie von Geschäften öffnen die zweite und nachfolgende sind auf andere Instrumente unter ein Verbot gestellt (der Bot arbeitet gleichzeitig auf verschiedenen Instrumenten). Ich denke, es sollte über eine globale Variable im Terminal geschehen, aber ich habe nicht genug Wissen und Erfahrung, ich habe gerade erst angefangen,MQL zu lernen. Dies ist ein Berater für binäre Optionen. Hier ist der Code

extern double Lots = 1; // Lose

extern int Exp = 1; // Verfall

extern int Wait = 1; // Anzahl der Candlesticks einer Richtung

extern int Timeout = 1; // Zeitintervall

extern double Multiplikator = 3; // Multiplikator

extern int Schlupf = 5; // Schlupf

extern int Magic = 2090; // Magie


int ticket, Typ;

doppelter Preis, Los;

//+------------------------------------------------------------------+

Experten-Initialisierungsfunktion //|.

//+------------------------------------------------------------------+

int OnInit()

{

return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+

//| Experten-Deinitialisierungsfunktion |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

}

//+------------------------------------------------------------------+

//| Experten-Tick-Funktion |

//+------------------------------------------------------------------+

void OnTick()

{

--------------- Offene Geschäfte ---------------

if (OrdersTotal() == 0) // Anzahl der Aufträge muss gleich Null sein

{

if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))

// Wenn der letzte Handel einen Verlust aufweist, wird derselbe Handel eröffnet, jedoch mit einem größeren Los.

{

Typ = TypeLastHistOrder();

if (Typ == OP_BUY) Preis = Ask;

if (Typ == OP_SELL) Preis = Bid;

Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

ticket = OrderSend(Symbol(), Typ, Lot, Preis, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)

// wenn der Gewinn des letzten Geschäfts gleich Null ist, wird das gleiche Geschäft eröffnet

{

Typ = TypeLastHistOrder();

if (Typ == OP_BUY) Preis = Ask;

if (Typ == OP_SELL) Preis = Bid;

Lot = NormalizeDouble(LotsLastHistOrder(), 2);

ticket = OrderSend(Symbol(), Typ, Lot, Preis, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))

|| CountHistTrades() == 0)// Wenn der letzte Handel profitabel ist, wird die Order eröffnet

{

wenn (SignalBuy() && OrdersTotal() == 0)

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (SignalSell() && OrdersTotal() == 0)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

Kommentar ("PriceCloseLastHistOrder(OP_BUY)= ", PriceCloseLastHistOrder(OP_BUY), "PriceCloseLastHistOrder(OP_SELL)=",

PriceCloseLastHistOrder(OP_SELL) );

}

}

}

}

//+------------------------------------------------------------------+

int CountTrades(int type = -1) // Ermittlung der Anzahl der Abschlüsse

{

int cnt = 0;

for (int i=OrdersTotal()-1; i>=0; i--) // Die Schleife durchläuft absolut alle offenen Aufträge, i ist die Auftragsnummer

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // Die Funktion prüft, ob der Auftrag mit der Auftragsnummer i auf dem Markt ist,

// Wenn dies der Fall ist, werden die folgenden Bedingungen geprüft...

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)) // Wenn das Symbol

// das Symbol, bei dem die Order offen ist, ist gleich dem aktuellen Symbol, der Ordertyp ist gleich magisch in den Einstellungen des aktuellen EA, und

// der Auftragstyp ist gleich type (oder type == -1 (falls es keine Rolle spielt, welcher Typ für die Auftragszählung erforderlich ist))

cnt++; // Die Variable cnt wird um 1 erhöht, und am Ende der Schleife ist cnt gleich der Anzahl der Geschäfte

// vom aktuellen EA für das aktuelle Währungspaar mit einem bestimmten Typ geöffnet

}

}

return(cnt); // der Wert der Variablen cnt wird zurückgegeben

}

//+------------------------------------------------------------------+

int CountHistTrades(int type = -1)

{

int cnt = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

cnt++;

}

}

zurück(cnt);

}

//+------------------------------------------------------------------+

bool SignalBuy()

{

for (int i=1; i<=Wait; i++)

{

if (Close[i] > Open[i]) return(false)

}

wenn ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

return(false);

}

//+------------------------------------------------------------------+

bool SignalSell()

{

for (int i=1; i<=Wait; i++)

{

if (Close[i] < Open[i]) return(false)

}

wenn ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

return(false);

}

//+------------------------------------------------------------------+

datetime TimeLastHistOrder(int type = -1)

{

datetime lasttime = 0;

datetime opentime = 0;


for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

if (OrderCloseTime() > lasttime)

{

lasttime = OrderCloseTime();

opentime = OrderOpenTime();

}

}

}

}

return(opentime);

}

//+------------------------------------------------------------------+

int TypeLastHistOrder()

{

datetime time = 0;

int Typ = -1;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

type = OrderType();

}

}

}

}

return(type);

}

//+------------------------------------------------------------------+

double LotsLastHistOrder(int type = -1)

{

datetime time = 0;

double lots = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

wenn (OrderOpenTime() > Zeit)

{

time = OrderOpenTime();

time = OrderLots();

}

}

}

}

return(lots);

}

//+------------------------------------------------------------------+

double PriceCloseLastHistOrder(int type = -1)

{

datetime time = 0;

double price = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

Preis = OrderClosePrice();

}

}

}

}

}

}

//+------------------------------------------------------------------+

double PriceOpenLastHistOrder(int type = -1)

{

datetime time = 0;

double price = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

Preis = OrderOpenPrice();

}

}

}

}

}

}

//+------------------------------------------------------------------+

 
Hallo, Kollegen!

Ich habeeine Frage beim Programmieren: Gibt es eine Möglichkeit, die Serverzeit im EA auf Millisekunden genau zu bekommen?
Zum Beispiel: Holen Sie sich: 23.09.2016 14h. : 53 min. : 54000 Millisekunden? Das sind genau 54 Sekunden, 000 Millisekunden.
 
e-partner:
Hallo Kollegen!

Ich habeeine Frage beim Programmieren: Ist es möglich, irgendwie im Expert Advisor die Serverzeit mit einer Genauigkeit von bis zu Millisekunden zu erhalten?
Zum Beispiel: Holen Sie sich: 23.09.2016 14h. : 53 min. : 54000 Millisekunden? Das sind genau 54 Sekunden, 000 Millisekunden.

Eine interessante Frage. Was meinen Sie mit der letzten bekannten Serverzeit, TimeCurrent() oder der aktuellen Zeit auf dem Server?

Wenn es sich um TimeCurrent() handelt, was nützt es dann, wenn man bedenkt, dass ein Paket mit einem neuen Kurs vom Server zum Terminal 10-500 ms durch das Internet geht und diese Zeit von Paket zu Paket variiert. Außerdem ist nicht klar, wann die letzte Notierung eintrifft, wenn sie von mehreren Quellen, Liquiditätsanbietern, zum Server kommt, verarbeitet wird und der Server dann einen neuen Tick sendet. Es ist auch nicht bekannt, wie der Systemtimer des Servers mit der astronomischen Zeit synchronisiert wird. Am 09.01.2014 von 04:15 bis 06:15 MSK (Donnerstag, Börsentag) habe ich das herausgefunden, denn die Abweichung ist nicht von astronomisch, sondern vom Durchschnitt von 31 Unternehmen. Die Abbildung für 25 Zeitpunkte zeigt diese Abweichungen (in Sekunden, nicht in ms):

Und welchen Sinn hat es, aus den Daten des Servers etwas in Millisekunden herauszufinden?

Die zweite Option ist eindeutiger. Wenn Ihr Computer mit einer Ihnen bekannten Genauigkeit mit der astronomischen Zeit synchronisiert ist, ist die astronomische Zeit in der Stadt, in der der Server läuft, mit der gleichen Genauigkeit bekannt. Aber wozu braucht man das...

 

Ich kann nicht herausfinden, wo die Optimierung durch den Strategietester geblieben ist. Die Schecks stehen alle, ich kann nichts verstehen. MT4 Build 1010. Windows 8.1.

Bitte teilen Sie mir mit, wie ich die Optimierung aktivieren kann.

Ich werde Screenshots anhängen. Ich kann die Schaltfläche Optimierung nicht sehen.

Dateien:
desktop.zip  129 kb
 
Warum erlaubt mein MT4 b1010 kein Debugging für historische Daten (Schaltfläche und Menüpunkt sind nicht aktiv)? Im MT5 ist alles in Ordnung.
 
Weil die Entwickler es verboten haben.
 
int Magik;
int Schlupf = 5,stopL1 = 50,takeP1 = 20;
int trend,TicketS,TicketB;
double rsi,TP,SL;
//+------------------------------------------------------------------+
Experteninitialisierungsfunktion //|
//+------------------------------------------------------------------+
int OnInit()
{
if(Ziffern == 3 || Ziffern == 5)
{
Schlupf *= 10;
stopL1 *= 10;
{ takeP1 *= 10;
}

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion |
//+------------------------------------------------------------------+
void OnTick()
{
double priseBuy = FindLastOrderPrise (OP_BUY);
double priseSel = FindLastOrderPrise (OP_SELL);
double frezeelevl = MarketInfo(OrderSymbol(),MODE_FREEZELEVEL);
rsi = iRSI(Symbol(),PERIOD_D1,7,PRICE_CLOSE,0);
trend = WhatTrend();
wenn (Anzahl der Geschäfte() == 0)
{
if(trend == 1 && rsi <=30)
{
if(OrderSend(Symbol(),OP_BUYLIMIT,0.10,Ask,Slippage,0,0, "erste Kauforder gesetzt",Magik,0)== true)
{
TicketB = FindLastTicket(OP_BUY);
if(TicketB >0)
{
SL = priseBuy + NormalizeDouble(takeP1 * Point,Digits);
TP = priseBuy - NormalizeDouble(stopL1 * Point,Digits);
if(OrderModify(TicketB,priseBuy,SL,TP,0)== true)
Kommentar("hooraaaahhhh");
}

}
}// if(trend == 1 && rsi <= 30)
sonst if(trend == 2 && rsi >= 70)
{
if(OrderSend(Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0, "first order set",Magik,0)== true)
{
for(int i = OrdersTotal()-1;i >0;i--)
{
OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES);
if (OrderType()== OP_SELL && OrderMagicNumber() == Magik)
{
double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)==true)break;
sonst weiter;
}
}
}
}
}// (CountTrades() == 0)

}

Ich bitte kompetente Programmierer zu erklären, was mein Fehler ist, warum die Reihenfolge nicht geändert wird und der Compiler dabei keine Fehler ausgibt.

 
Ich habe das Tutorial studiert. Ich habe gelesen und Notizen gemacht...könnten Sie speziell auf Fehler hinweisen...denn der Compiler gibt keine Fehler an und es gibt keine Fehler im Tester.aber die Reihenfolge wird nicht geändert.als ob die Reihenfolge im Programm überhaupt nicht sichtbar ist
 
burbur87:
Ich habe das Tutorial studiert, gelesen und mir Notizen gemacht. Könnten Sie die Fehler konkret benennen, weil der Compiler keine Fehler ausgibt und es keine Fehler im Tester gibt, aber die Reihenfolge nicht geändert wird? es ist, als ob die Reihenfolge im Programm überhaupt nicht gesehen wird.

Lesen Sie sorgfältig, was OrderSend() zurückgibt

 if(OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0) > 0)

Eigentlich würde ich Folgendes tun:

   int ticket=OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0);
   if(ticket>=0)
      {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
          {
            if (OrderStopLoss()==0 || OrderTakeProfit()==0)
             {
               double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
               double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)) Print("Error ",GetLastError()," modify order ",ticket);
             }
          }
      }
 
Sepulca:

Lesen Sie sorgfältig, was OrderSend() zurückgibt

if(ticket>=0)

Ich würde es sogar so machen:

Kann ein Ticket auf Null gesetzt werden?