Vielen Dank, Sergei! Wenn ich das richtig verstehe: Im ersten Fall wird ein Array statischer Variablen erstellt, jede für ihr eigenes Symbol mit einem festen Zeitrahmen, d. h. für dieses Symbol kann kein anderer Zeitrahmen verwendet werden; Im zweiten Fall eine Klasse für jede Kombination von Symbol und Zeitrahmen.
MikeZv: Vielen Dank, Sergei! Wenn ich das richtig verstehe: Im ersten Fall wird ein Array statischer Variablen erstellt, jede für ihr eigenes Symbol mit einem festen Zeitrahmen, d. h. für dieses Symbol kann kein anderer Zeitrahmen verwendet werden; Im zweiten Fall eine Klasse für jede Kombination aus Symbol und Zeitrahmen.
Ja, richtig, aber wenn Sie ein wenig nachdenken, können Sie das eindimensionale Array durch ein zweidimensionales in der Array-Variante ersetzen.
Eine solche Frage. Hat jemand irgendwo einen Vorlagencode für das Öffnen, Prüfen und Schließen von Aufträgen gesehen, ohne eine Öffnungs- und Schließbedingung? Ich werde versuchen, selbst eine Bedingung zu schreiben, aber ich erhalte eine Fehlermeldung nach der anderen, wenn ich einen Abschlussauftrag schreibe... Vor allem bin ich schlecht darin, Aufträge zu finden und zu überprüfen, um sie abzuschließen.
Vitaliy Medvedev: Hier ist eine Frage. Hat irgendjemand irgendwo anders den Vorlagencode für das Öffnen, Prüfen und Schließen von Aufträgen ohne Bedingungen für das Öffnen und Schließen gesehen? Ich habe versucht, eine Bedingung selbst zu schreiben, aber wenn ich beginne, einen Abschlussauftrag Fehler auf Fehler zu schreiben... Vor allem bin ich schlecht darin, Aufträge zu finden und zu überprüfen, um sie abzuschließen.
Es ist nicht verwunderlich, dass dies nicht gut funktioniert. Denn wenn es keine Abschlussbedingungen gibt, dann sollte das Auffinden und Prüfen solcher Aufträge nach dem Motto erfolgen: Finde das, ich weiß nicht was, und schließe es ab.
Legen Sie zunächst die Bedingungen für die Auswahl des abzuschließenden Auftrags fest, dann ist es viel einfacher, ihn zu analysieren. Schließlich müssen wir im Falle eines Missverständnisses nur prüfen, ob die bekannten Bedingungen erfüllt sind.
Es ist nicht verwunderlich, dass dies nicht gut funktioniert. Wenn wir keine Abschlussbedingungen haben, dann sollte die Suche und Prüfung solcher Aufträge in folgendem Sinne erfolgen: etwas finden und abschließen.
Legen Sie zunächst die Bedingungen für die Auswahl der Aufträge für den Abschluss fest, dann wird es einfacher sein, sie zu sortieren. Wenn es ein Missverständnis gibt, müssen wir einfach prüfen, ob die uns bekannten Bedingungen richtig sind.
Das ist alles klar, ich habe die Bedingungen definiert, aber die Öffnung der Aufträge nach den Bedingungen (Öffnung ist immer noch ein Müll, ich kann kaum verwalten, um sie zu öffnen ...),
Und erst recht der korrekteAbschluss von Aufträgen ... Was für eine Sauerei!
Es ist alles klar, ich habe die Bedingungen ausgearbeitet, aber die Eröffnung von Aufträgen nach den Bedingungen, (die Eröffnung ist immer noch ein Unsinn, die Eröffnung, mit ein wenig Kampf...),
Und erst recht der korrekteAbschluss von Aufträgen ... Was für eine Sauerei!
Wenn Sie wissen, welchen Auftrag Sie abschließen wollen, schließen Sie ihn anhand seiner Ticketnummer ab.
Es ist alles klar, ich habe die Bedingungen ausgearbeitet, aber die Eröffnung von Aufträgen nach den Bedingungen, (die Eröffnung ist immer noch ein Unsinn, die Eröffnung, mit ein wenig Kampf...),
Und erst recht der korrekteAbschluss von Aufträgen ... Was für eine Sauerei!
Hier ist, wie es mir aus dem Herzen gerissen wurde...
int Total_orders(int type)
{
int n=0;
int total=OrdersTotal();
for(int i=0; i<total; i++)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderType()!=type)continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
n++;
}
return(n);
}
//+------------------------------------------------------------------+void OrderOpen(int type,double sl)
{
double price=0.0;
double lot;
if(error>1)return;
if(type==WRONG_VALUE) return;
if(Risk!=0.0)lot=LotNormalize(LotVolume(Risk,sl));
else lot=LotNormalize(Lot);
do
{
if(type==OP_BUY)
{
RefreshRates();
price=NormalizeDouble(Ask,_Digits);
if(AccountFreeMarginCheck(_Symbol,type,lot)<=0)return;
}
if(type==OP_SELL)
{
RefreshRates();
price=NormalizeDouble(Bid,_Digits);
if(AccountFreeMarginCheck(_Symbol,type,lot)<=0)return;
}
int Ticket=OrderSend(_Symbol,type,lot,price,10000,0,0,CommentOrder,Magic);
if(Ticket>0)
{
error=Fun_Error(_Symbol,GetLastError());
Alert(__FUNCTION__,": open order ",StrToType(type)," ",_Symbol," :",Ticket);
}
else error=Fun_Error(_Symbol,GetLastError());
}
while(error==1 && !IsStopped());
}
//+------------------------------------------------------------------+void Order_Close(int type)
{
double price=0.0;
int total=OrdersTotal();
if(error>1)return;
for(int i=total-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderType()!=type)continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
do
{
if(OrderType()==OP_BUY)
{
RefreshRates();
price=NormalizeDouble(Bid,_Digits);
}
if(OrderType()==OP_SELL)
{
RefreshRates();
price=NormalizeDouble(Ask,_Digits);
}
int res=OrderClose(OrderTicket(),OrderLots(),price,10000);
if(res)
{
Alert(__FUNCTION__,": close order ",StrToType(OrderType())," ",OrderSymbol()," :",OrderTicket());
error=Fun_Error(_Symbol,GetLastError());
}
else error=Fun_Error(_Symbol,GetLastError());
}
while(error==1 && !IsStopped());
}
}
//+------------------------------------------------------------------+void ModifySL(int Stop_Loss)
{
if(Stop_Loss<=0)return;
double sl=0.0;
bool res;
int total=OrdersTotal();
for(int i=0; i<total; i++)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(OrderStopLoss()!=0)continue;
if(OrderType()==OP_BUY) sl=NormalizeDouble(OrderOpenPrice()-(New_Stop(Stop_Loss)*_Point),_Digits);
if(OrderType()==OP_SELL) sl=NormalizeDouble(OrderOpenPrice()+(New_Stop(Stop_Loss)*_Point),_Digits);
res=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
if(!res)Print(__FUNCTION__,": Error modifying StopLoss order ",StrToType(OrderType())," № - ",GetLastError()," ",OrderSymbol()," ",OrderTicket());
}
}
//+------------------------------------------------------------------+void ModifyTP(int Take_Profit)
{
if(Take_Profit<=0)return;
double tp=0.0;
bool res;
int total=OrdersTotal();
for(int i=0; i<total; i++)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(OrderTakeProfit()!=0)continue;
if(OrderType()==OP_BUY) tp=NormalizeDouble(OrderOpenPrice()+(New_Stop(Take_Profit)*_Point),_Digits);
if(OrderType()==OP_SELL) tp=NormalizeDouble(OrderOpenPrice() -(New_Stop(Take_Profit)*_Point),_Digits);
res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp,0);
if(!res)Print(__FUNCTION__,": Error modifying TakeProfit order ",StrToType(OrderType())," № - ",GetLastError()," ",OrderSymbol()," ",OrderTicket());
}
}
//+------------------------------------------------------------------+double LotVolume(double procent,double sl)
{
double lot=0.0;
double tv=MarketInfo(_Symbol,MODE_TICKVALUE);
double minlot=MarketInfo(_Symbol,MODE_MINLOT);
double maxlot=MarketInfo(_Symbol,MODE_MAXLOT);
if(sl!=0 && tv!=0) lot=(AccountFreeMargin()*procent)/(sl*tv*100.0);
if(lot < minlot)lot = minlot;
if(lot > maxlot)lot = maxlot;
return(lot);
}
//+------------------------------------------------------------------+double LotNormalize(double lot)
{
double minlot=MarketInfo(_Symbol,MODE_MINLOT);
double maxlot=MarketInfo(_Symbol,MODE_MAXLOT);
if(lot < minlot)lot = minlot;
if(lot > maxlot)lot = maxlot;
if(minlot==0.001) return(NormalizeDouble(lot,3));
if(minlot==0.01) return(NormalizeDouble(lot,2));
if(minlot==0.1) return(NormalizeDouble(lot,1));
return(NormalizeDouble(lot,0));
}
//+------------------------------------------------------------------+string StrToType(int type)
{
if(type==OP_BUY)return("Buy");
if(type==OP_SELL)return("Sell");
return(NULL);
}
//+------------------------------------------------------------------+int New_Stop(int Parametr)
{
int Min_Dist=(int)MarketInfo(_Symbol,MODE_STOPLEVEL);
if(Parametr<Min_Dist)
{
Parametr=Min_Dist*2+(int)MarketInfo(_Symbol,MODE_SPREAD);
Alert(_Symbol," Увеличина дистанция стоп-приказа.");
}
return(Parametr);
}
//+------------------------------------------------------------------+int Fun_Error(string symbol,int Error)
{
switch(Error)
{
case0:return(0);
case1:Alert(symbol," ",Error,":No error returned, but the result is unknown");return(2);
case2:Alert(symbol," ",Error,":Common error");return(2);
case3:Alert(symbol," ",Error,":Invalid trade parameters");return(2);
case4:Alert(symbol," ",Error,":Trade server is busy");Sleep(3000);return(1);
case5:Alert(symbol," ",Error,":Old version of the client terminal");return(2);
case6:Alert(symbol," ",Error,":No connection with trade server");Sleep(3000);return(1);
case7:Alert(symbol," ",Error,":Not enough rights");return(2);
case8:Alert(symbol," ",Error,":Too frequent requests");return(2);
case9:Alert(symbol," ",Error,":Malfunctional trade operation");return(2);
case64:Alert(symbol," ",Error,":Account disabled");return(2);
case65:Alert(symbol," ",Error,":Invalid account");return(2);
case128:Alert(symbol," ",Error,":Trade timeout");return(1);
case129:Alert(symbol," ",Error,":Invalid price");return(2);
case130:Alert(symbol," ",Error,":Invalid stops");return(2);
case131:Alert(symbol," ",Error,":Invalid trade volume");return(2);
case132:Alert(symbol," ",Error,":Market is closed");Sleep(10000);return(1);
case133:Alert(symbol," ",Error,":Trade is disabled");return(2);
case134:Alert(symbol," ",Error,":Not enough money");return(2);
case135:Alert(symbol," ",Error,":Price changed");return(1);
case136:Alert(symbol," ",Error,":Off quotes");Sleep(3000);return(1);
case137:Alert(symbol," ",Error,":Broker is busy");Sleep(3000);return(1);
case138:Alert(symbol," ",Error,":Requote");return(1);
case139:Alert(symbol," ",Error,":Order is locked");Sleep(10000);return(1);
case140:Alert(symbol," ",Error,":Buy orders only allowed");return(2);
case141:Alert(symbol," ",Error,":Too many requests");return(2);
case145:Alert(symbol," ",Error,":Modification denied because order is too close to market");Sleep(10000);return(1);
case146:Alert(symbol," ",Error,":Trade context is busy");Sleep(3000);return(1);
case147:Alert(symbol," ",Error,":Expirations are denied by broker");return(2);
case148:Alert(symbol," ",Error,":The amount of open and pending orders has reached the limit set by the broker");return(2);
case149:Alert(symbol," ",Error,":An attempt to open an order opposite to the existing one when hedging is disabled");return(2);
case150:Alert(symbol," ",Error,":An attempt to close an order contravening the FIFO rule");return(2);
default:Alert(symbol,":Error - № ",Error);return(2);
}
return(0);
}
Denn während die Schleife ausgeführt wird, könnte sich der Wert vonOrdersTotal(); ändern und Sie könnten eine Bestellung übersehen oder der Schleifenkörper könnte ausfallen
Hier ist eine weitere Option, die die Klasse
Testergebnis
Im ersten Fall wird ein Array statischer Variablen erstellt, jede für ihr eigenes Symbol mit einem festen Zeitrahmen, d. h. für dieses Symbol kann kein anderer Zeitrahmen verwendet werden;
Im zweiten Fall eine Klasse für jede Kombination von Symbol und Zeitrahmen.
Vielen Dank, Sergei! Wenn ich das richtig verstehe:
Im ersten Fall wird ein Array statischer Variablen erstellt, jede für ihr eigenes Symbol mit einem festen Zeitrahmen, d. h. für dieses Symbol kann kein anderer Zeitrahmen verwendet werden;
Im zweiten Fall eine Klasse für jede Kombination aus Symbol und Zeitrahmen.
Hier ist eine Frage. Hat irgendjemand irgendwo anders den Vorlagencode für das Öffnen, Prüfen und Schließen von Aufträgen ohne Bedingungen für das Öffnen und Schließen gesehen? Ich habe versucht, eine Bedingung selbst zu schreiben, aber wenn ich beginne, einen Abschlussauftrag Fehler auf Fehler zu schreiben... Vor allem bin ich schlecht darin, Aufträge zu finden und zu überprüfen, um sie abzuschließen.
Es ist nicht verwunderlich, dass dies nicht gut funktioniert. Denn wenn es keine Abschlussbedingungen gibt, dann sollte das Auffinden und Prüfen solcher Aufträge nach dem Motto erfolgen: Finde das, ich weiß nicht was, und schließe es ab.
Legen Sie zunächst die Bedingungen für die Auswahl des abzuschließenden Auftrags fest, dann ist es viel einfacher, ihn zu analysieren. Schließlich müssen wir im Falle eines Missverständnisses nur prüfen, ob die bekannten Bedingungen erfüllt sind.
Es ist nicht verwunderlich, dass dies nicht gut funktioniert. Wenn wir keine Abschlussbedingungen haben, dann sollte die Suche und Prüfung solcher Aufträge in folgendem Sinne erfolgen: etwas finden und abschließen.
Legen Sie zunächst die Bedingungen für die Auswahl der Aufträge für den Abschluss fest, dann wird es einfacher sein, sie zu sortieren. Wenn es ein Missverständnis gibt, müssen wir einfach prüfen, ob die uns bekannten Bedingungen richtig sind.
Das ist alles klar, ich habe die Bedingungen definiert, aber die Öffnung der Aufträge nach den Bedingungen (Öffnung ist immer noch ein Müll, ich kann kaum verwalten, um sie zu öffnen ...),
Und erst recht der korrekteAbschluss von Aufträgen ... Was für eine Sauerei!
Es ist alles klar, ich habe die Bedingungen ausgearbeitet, aber die Eröffnung von Aufträgen nach den Bedingungen, (die Eröffnung ist immer noch ein Unsinn, die Eröffnung, mit ein wenig Kampf...),
Und erst recht der korrekteAbschluss von Aufträgen ... Was für eine Sauerei!
Es ist alles klar, ich habe die Bedingungen ausgearbeitet, aber die Eröffnung von Aufträgen nach den Bedingungen, (die Eröffnung ist immer noch ein Unsinn, die Eröffnung, mit ein wenig Kampf...),
Und erst recht der korrekteAbschluss von Aufträgen ... Was für eine Sauerei!
Hier ist, wie es mir aus dem Herzen gerissen wurde...
So bekomme ich es aus meinem Herzen.
Oh... Ach was! Ich habe das nicht oft gemacht...! Ja, nun... Jetzt weiß ich, warum die Dinge nicht so funktionieren, wie sie sollten.
Vielen Dank, menschlich.
Halte es, als käme es von meinem Herzen.
Darf ich fragen, warum Sie das tun?
int total=OrdersTotal();
Darf ich fragen, warum das so ist?
int total=OrdersTotal();