Ich schrieb Code, dass, wenn eine Bestellung schließt alle anderen anhängigen Aufträge, aber das Problem ist, dass ich schrieb 4 Aufträge 2, 3, 4, 5. Wenn also die nächsten anhängigen Aufträge 6, 7, 8 usw. geöffnet werden, sollten sie nicht geschlossen werden. Die Anzahl der rot hervorgehobenen Aufträge sollte so geändert werden, dass alle anhängigen Aufträge geschlossen werden.
Ich schrieb Code, dass, wenn eine Bestellung schließt alle anderen anhängigen Aufträge, aber das Problem ist, dass ich schrieb 4 Aufträge 2, 3, 4, 5. Wenn also die nächsten anhängigen Aufträge 6, 7, 8 usw. geöffnet werden, sollten sie nicht geschlossen werden. Die rot hervorgehobenen Auftragsnummern sollten in solche Aufträge geändert werden, für die alle ausstehenden Aufträge geschlossen werden.
Zunächst prüfen wir in der Schleife, ob die Position kürzlich geschlossen wurde oder nicht, wofür wir OrdersHistoryTotal benötigen. Hier wird der Zeitpunkt des Schließens der Position OrderCloseTime überprüft. Ist dieser höher als der letzte Wert in der Variable, werden alle offenen OrdersTotal durchlaufen. Und schließen Sie sie.
P.S. Fügen Sie den Code mit Alt+S oder der
Zum Beispiel dies
// retrieving info from trade historyint i,accTotal=OrdersHistoryTotal();
for(i=0;i<accTotal;i++)
{
//---- check selection resultif(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
break;
}
// работа с ордером ...
}
externstring TimeStart = "04:00"; //Время начала контрольного периодаexternstring TimeEnd = "09:00"; //Время окончания контрольного периодаexternstring TimeCloseOrder = "23:30";//Время в которое происходит закрытие всех ордеровexterndouble LOT = 0.1;
externint Magic = 777;
externdouble K_martin = 2;
externbool No_Loss = true;
int slippage = 3;
double marga,Lot,SL,TP;
int tip,Orders,tipOrders,TradeDey;
//-------------------------------------------------------------------+int init()
{
if (Digits==5 || Digits==3) slippage = 30;
}
int start()
{
datetime Time_Start = StrToTime(StringConcatenate(Day(),".",Month(),".",Year()," ",TimeStart, ":00"));
datetime Time_End = StrToTime(StringConcatenate(Day(),".",Month(),".",Year()," ",TimeEnd, ":00"));
datetime Time_CloseOrder = StrToTime(StringConcatenate(Day(),".",Month(),".",Year()," ",TimeCloseOrder,":00"));
if (Time_CloseOrder>Time_End) if (CurTime()>=Time_CloseOrder) CLOSEORDERS();
int tip;
if (Orders>OrdersTotal()) tip=CloseOrder();
Orders=OrdersTotal();
if (ORDERS(0)==0 && tip==0 && (CurTime()<Time_CloseOrder || Time_CloseOrder<=Time_End) && TradeDey!=TimeDay(CurTime()))
{
int BarStart = iBarShift(NULL,0,Time_Start,false);
int BarEnd = iBarShift(NULL,0,Time_End ,false);
double Max_Price=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,BarStart-BarEnd,BarEnd));
double Min_Price=iLow (NULL,0,iLowest (NULL,0,MODE_LOW, BarStart-BarEnd,BarEnd));
if (TimeCurrent()>Time_End && ObjectFind("bar0"+Time_End)==-1)
{
ObjectCreate("bar0"+Time_End, OBJ_RECTANGLE, 0, 0,0, 0,0);
ObjectSet ("bar0"+Time_End, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet ("bar0"+Time_End, OBJPROP_COLOR, Blue);
ObjectSet ("bar0"+Time_End, OBJPROP_BACK, true);
ObjectSet ("bar0"+Time_End, OBJPROP_TIME1 ,Time_Start);
ObjectSet ("bar0"+Time_End, OBJPROP_PRICE1,Max_Price);
ObjectSet ("bar0"+Time_End, OBJPROP_TIME2 ,Time_End);
ObjectSet ("bar0"+Time_End, OBJPROP_PRICE2,Min_Price);
}
if (Bid>Max_Price) OrderSend(Symbol(),OP_BUY,LOT,Bid,slippage,Min_Price,
NormalizeDouble(Ask + Max_Price-Min_Price,Digits),"BreakdownLevel",Magic,Blue);
if (Bid<Min_Price) OrderSend(Symbol(),OP_SELL,LOT,Bid,slippage,Max_Price,
NormalizeDouble(Bid - Max_Price+Min_Price,Digits),"BreakdownLevel",Magic,Blue);
return;
}
if (No_Loss) No_Loss();
if (tip==1 && TradeDey!=TimeDay(CurTime()))
{
Lot=Lot*K_martin;
if (tipOrders==0) OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,SL,TP,"Nevalyashka",Magic,Blue);
if (tipOrders==1) OrderSend(Symbol(),OP_BUY ,Lot,Ask,slippage,SL,TP,"Nevalyashka",Magic,Blue);
}
return(0);
}
//-------------------------------------------------------------------+int CloseOrder()
{
string txt;
double loss;
int i=OrdersHistoryTotal()-1;
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
{
if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
{
tipOrders=OrderType();
Lot=OrderLots();
loss = MathAbs(OrderProfit()/MarketInfo(Symbol(),MODE_TICKVALUE)/Lot/K_martin);
if (tipOrders==0)
{
TP=NormalizeDouble(Bid - loss*Point,Digits);
SL=NormalizeDouble(Ask + loss*Point,Digits);
}
if (tipOrders==1)
{
SL=NormalizeDouble(Bid - loss*Point,Digits);
TP=NormalizeDouble(Ask + loss*Point,Digits);
}
if (OrderClosePrice()==OrderTakeProfit() || OrderProfit()>=0) TradeDey=TimeDay(CurTime());
if (OrderClosePrice()==OrderStopLoss()) return(1);
}
}
return(0);
}
//+-----------------------------------------------------------------+int ORDERS(int tip)
{
int N_Sell,N_Buy;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
{
if (OrderType()==OP_BUY ) N_Buy++;
if (OrderType()==OP_SELL) N_Sell++;
}
}
}
if (tip== 0) return(N_Buy+N_Sell);
if (tip== 1) return(N_Buy);
if (tip==-1) return(N_Sell);
}
//-------------------------------------------------------------------+void No_Loss()
{
int tip;
double TP,OOP;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
tip = OrderType();
if (tip<2 && OrderSymbol()==Symbol())
{
if (OrderMagicNumber()!=Magic) continue;
TP = OrderTakeProfit();
OOP = OrderOpenPrice();
if (tip==0) //Bay
{
if (OrderStopLoss()>OrderOpenPrice()+Ask-Bid) return;
if ((TP-OOP)/2+OOP<=Bid)
OrderModify(OrderTicket(),OOP,NormalizeDouble(OOP+Ask-Bid,Digits),TP,0,White);
}
if (tip==1) //Sell
{
if (OrderStopLoss()<OrderOpenPrice()-Ask+Bid) return;
if (OOP-(OOP-TP)/2>=Ask)
OrderModify(OrderTicket(),OOP,NormalizeDouble(OOP-Ask+Bid,Digits),TP,0,White);
}
}
}
}
}
//------------------------------------------------------------------+void CLOSEORDERS()
{
bool error;
int err;
while (true)
{ error=true;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if (OrderSymbol()!=Symbol()||Magic!=OrderMagicNumber()) continue;
if (OrderType()==OP_BUY)
error=OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
if (OrderType()==OP_SELL)
error=OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
}
}
if (!error) {err++;Sleep(2000);RefreshRates();}
if (error || err >5) return;
}
}
//-------------------------------------------------------------------+
Hier ist eine Frage, einige Problem mit Takeprofits und Stoplosses, aus irgendeinem Grund TP und SL ändern, auf Aufträge geöffnet mit erhöhten Menge, selbst . Und es erhöht die Lose, aber das Schließen durch TP erlaubt es nicht, den Betrag der Verluste zurückzugeben. Warum passiert das, was ist falsch?
Hallo, ich habe die Funktion nicht geschrieben. Roboter schreibt Fehler falsche Startposition 0 für ArraySort Funktion. Ich wäre Ihnen dankbar, wenn Sie mir helfen könnten, das Problem zu beheben und die Funktion zu erklären
void MaxMinProfit()
{
int i, N, MaxTic, MinTic;
double MinProf=0, MaxProf=0, OP, g, a[][2];
string MinSym, MaxSym;
ArrayResize(a, 0);
for (i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderType()==OP_SELL || OrderType()==OP_BUY )
{
OP = NormalizeDouble(OrderProfit()+OrderSwap()+OrderCommission(),2);
if (MinProf>OP)
{
MinProf=OP;
MinTic=OrderTicket();
MinSym=OrderSymbol();
}
if (OP>0)
{
N++;
ArrayResize(a, N);
a[N-1][0]=OP;
a[N-1][1]=OrderTicket();
}
}
}
}
ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND);//MODE_ASCEND);for (i=0; i<Level; i++)
{
g+=a[i][0];
//int ti=a[i-2][1];
}
if(MinProf <0 && (g+MinProf)>=ProcMax)
{
for (i=0; i<Level; i++)
{
if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES))
{
//Alert(a[i][1]);if (OrderType()== OP_BUY)
{
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), Slip, CLR_NONE);
}
if (OrderType()== OP_SELL)
{
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_ASK), Slip, CLR_NONE);
}
}
}
if (OrderSelect(MinTic, SELECT_BY_TICKET, MODE_TRADES))
{
if (OrderType()== OP_BUY)
{
OrderClose(MinTic, OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), Slip, CLR_NONE);
}
if (OrderType()== OP_SELL)
{
OrderClose(MinTic, OrderLots(), MarketInfo(OrderSymbol(),MODE_ASK), Slip, CLR_NONE);
}
}}
return;
}
Ich schrieb Code, dass, wenn eine Bestellung schließt alle anderen anhängigen Aufträge, aber das Problem ist, dass ich schrieb 4 Aufträge 2, 3, 4, 5. Wenn also die nächsten anhängigen Aufträge 6, 7, 8 usw. geöffnet werden, sollten sie nicht geschlossen werden. Die Anzahl der rot hervorgehobenen Aufträge sollte so geändert werden, dass alle anhängigen Aufträge geschlossen werden.
void start(){
//----
double Take1 = Ask+20 *Point;
double Take2 = Ask+0 *Point;
double Take3 = Ask-20 *Point;
double Take4 = Ask-40 *Point;
double Take5 = Ask-60 *Point;
double Stop = Bid-StopLoss *Point;
if(AufträgeSumme()==0){
OrderSend(Symbol(),0,0.01,Ask,30,Stop,Take1,",0,0,CLR_NONE);
OrderSend(Symbol(),2,0.02,Ask-20*Point,30,Stop,Take2,"",0,0,CLR_NONE);
OrderSend(Symbol(),2,0.04,Ask-40*Point,30,Stop,Take3,",0,0,CLR_NONE);
OrderSend(Symbol(),2,0.08,Ask-60*Point,30,Stop,Take4,",0,0,CLR_NONE);
OrderSend(Symbol(),2,0.16,Ask-80*Point,30,Stop,Take5,"",0,0,CLR_NONE);
}
if(AufträgeSumme()==4)
{
BestellungLöschen(2);
}
if(AufträgeSumme()==3)
{
BestellungLöschen(3);
}
if(AufträgeSumme()==2)
{
BestellungLöschen(4);
}
if(AufträgeSumme()==1)
{
BestellungLöschen(5);
zurück(0);
}
Ich schrieb Code, dass, wenn eine Bestellung schließt alle anderen anhängigen Aufträge, aber das Problem ist, dass ich schrieb 4 Aufträge 2, 3, 4, 5. Wenn also die nächsten anhängigen Aufträge 6, 7, 8 usw. geöffnet werden, sollten sie nicht geschlossen werden. Die rot hervorgehobenen Auftragsnummern sollten in solche Aufträge geändert werden, für die alle ausstehenden Aufträge geschlossen werden.
Zunächst prüfen wir in der Schleife, ob die Position kürzlich geschlossen wurde oder nicht, wofür wir OrdersHistoryTotal benötigen. Hier wird der Zeitpunkt des Schließens der Position OrderCloseTime überprüft. Ist dieser höher als der letzte Wert in der Variable, werden alle offenen OrdersTotal durchlaufen. Und schließen Sie sie.
P.S. Fügen Sie den Code mit Alt+S oder der

Zum Beispiel dies
Hier ist die Bedingung if(OrdersTotal()==0). Aber wie sollten wir die Bedingung schreiben, wenn es keine Buchten gibt?
Wenn (OP_BUY==0)
Wenn (OP_BUY==0)