Ja, diese Regelung ist übrigens intelligenter in der Umsetzung. Die zugehörige Funktion am Anfang nimmt nun mehr Platz ein. Das Ergebnis sah folgendermaßen aus:
Es gibt doch nichts zu optimieren, oder?
Ich meine, dass es viel bequemer ist, wenn es am Anfang gar nicht viel gibt. Und alles wird rein über Funktionen aufgerufen. Und beim letzten Mal stellte sich heraus, dass der Start alle möglichen Verschachtelungen von Hauptfunktionen und Überladungen von zusätzlichen Funktionen aufweist...
Und warum sollte man ein Array per Referenz übergeben, wenn man einen global deklarierten Array-Namen in einer Funktion verwendet? Vielleicht sollten Sie es so machen:
void FindOrders(int &massive[])
{
int oType;
ArrayInitialize(massive, 0);
for (int i=OrdersTotal() - 1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != i_magic) continue;
oType = OrderType();
massive[oType] = massive[oType] + 1;
}
}
Und Sie können es ein wenig reduzieren:
void FindOrders(int &massive[])
{
ArrayInitialize(massive, 0);
for (int i=OrdersTotal() - 1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != i_magic) continue;
massive[OrderType()] = massive[OrderType()] + 1;
}
}
Und was ist mit dem Aufruf von Start und der Anzeige von Nachrichten? Ich habe den Eindruck, dass sie etwas durcheinander gebracht haben. Wir können die Funktion pr() nicht sehen, also können wir nichts vorschlagen.
Ich habe die Anzahl der Aufträge im Testgerät mit einem schnellen Algorithmus überprüft:
Sie können die gesamte Ausgabe in eine Funktion verpacken, die Daten aus dem Array liest und die Informationen auf eine menschliche Art und Weise anzeigt.
Warum ein Array per Referenz übergeben, wenn Sie einen global deklarierten Array-Namen in der Funktion verwenden? Vielleicht sollte es so sein:
void FindOrders(int &massive[])
{
int oType;
ArrayInitialize(massive, 0);
for (int i=OrdersTotal() - 1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != i_magic) continue;
oType = OrderType();
massive[oType] = massive[oType] + 1;
}
}
Ja, das ist tatsächlich sinnvoll. Aber auch hier übergeben Sie es per Referenz:)) Ich hatte es nach dem letzten Mal, als Parameter nicht global deklariert wurden.
Und über die pr-Funktion. Hier ist sie:
//+-------------------------------------------------------------------------------------+//| Распринтовка на экран |//+-------------------------------------------------------------------------------------+void pr (string txt)
{
string info [];
ArrayResize(info, 20);
string h, m, s, cm; int i;
h = DoubleToStr(Hour(), 0); if (StringLen(h) < 2) h = "0" + h;
m = DoubleToStr(Minute(), 0); if (StringLen(m) < 2) m = "0" + m;
s = DoubleToStr(Seconds(), 0); if (StringLen(s) < 2) s = "0" + s;
txt = h + ":" + m + ":" + s + " - " + txt;
for (i=20-1; i>=1; i--)
info[i] = info[i-1];
info[0] = txt;
for (i=20-1; i>=0; i--)
if (info[i] != "")
{
cm = info[i];
ObjectCreate ("txtw"+i, OBJ_LABEL, 0, 0, 0);
ObjectSet ("txtw"+i, OBJPROP_CORNER, 1);
ObjectSet ("txtw"+i, OBJPROP_XDISTANCE, 10);
ObjectSet ("txtw"+i, OBJPROP_YDISTANCE, 30+15*i);
ObjectSetText("txtw"+i, cm, 10, "Times New Roman", Green);
}
}
Ich meine, gibt es eine Einstellung oder etwas anderes, das Sie brauchen?
Ich meine, ich glaube nicht, dass es hier irgendwelche Telepathen gibt, und selbst wenn, versuchen Sie einfach, sie für so ein Kunststück zu interessieren... Raten und helfen...
Ich habe einen anhaltenden Stillstand bei der Schließung von benötigten Positionen. Die Quintessenz ist folgende:
1. Die Schließung von Positionen wird verfolgt.
2. Sobald die letzte Position auf dem Takeaway geschlossen wurde... ...sollten alle offenen und schwebenden Positionen sofort geschlossen werden. Alles wird nach Losen sortiert geschlossen, d.h. große Lose auf einmal, dann kleinere. Dies ist nur dazu gedacht, Erfahrungen mit Aufträgen zu sammeln.
Die Umsetzung erfolgt wie folgt:
In start() bei jedem Tick:
for (int ord=OrdersTotal()-1; ord>=0; ord--)
{
if (!OrderSelect(ord,SELECT_BY_POS)) continue;
if (OrderMagicNumber() != i_magic) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() == 6) continue;
g_ticket = OrderTicket();
g_type = OrderType();
// Блок модификации ордеров
if (i_sl != 0 || i_tp != 0)
{
if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
{
OrdersModifyer(g_ticket);
}
}
// Закрытие всех ордеров, если последний ордер закрыт
if (isCloseByTakeLastOpenPos(2))
{
// if (g_type < 2)
{
ClosePosBySortLots();
}
//else
if (g_type > 1)
{
DeletePendingOrders(g_ticket);
}
}
}
Wir sind an der Schließung von Marktaufträgen interessiert, da die anhängigen Aufträge bei Bedarf gelöscht werden. Hier ist, was wir haben:
//+-------------------------------------------------------------------------------------+//| Получаем состояние последней позиции (Открыта или закрыта) |//+-------------------------------------------------------------------------------------+bool isCloseByTakeLastOpenPos(int delta)
{
datetime lastOrderCloseTime = -1, // Время закрытия последнего открытого ордера
lastOOTHist = -1; // Время открытия последнего открытого ордера из историиint j = -1;
pr ("Запустилась функция isCloseByTakeLastOpenPos");
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderMagicNumber() != i_magic) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() > 1) continue; // Все удалённые отложки нас не интересуют..if (lastOrderCloseTime < OrderCloseTime()) // Находим время закрытия..
{
lastOrderCloseTime = OrderCloseTime(); // ..последней закрытой позиции в истории
j = i;
pr ("j = " + j + " " + TimeToStr(TimeCurrent()));
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
// pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + " " + TimeToStr(TimeCurrent()));// pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + " " + TimeToStr(TimeCurrent()));if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false);
else
{
lastOOTHist = OrderOpenTime();
Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
"\n", "j = ", j,
"\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS));
}
}
else
{
Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
"\n", "j = ", j,
"\n", "не удалось выбрать ордер в истории");
return(false);
}
for(int h=OrdersTotal()-1; h>=0; h--)
{
if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() != i_magic) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() > 1) continue;
if (lastOOTHist < OrderOpenTime()) return(false); // Выбранная рыночная позиция открыта позже закрытой по тейку
}
else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
}
return (true);
}
//+-------------------------------------------------------------------------------------+//| Закрытие ордеров, отсортированных по размеру лотов |//+-------------------------------------------------------------------------------------+void ClosePosBySortLots()
{
double a[][2];
int p = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderMagicNumber() != i_magic) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() < 2)
{
p++;
ArrayResize(a, p);
a[p-1][0] = OrderLots();
a[p-1][1] = OrderTicket();
}
}
pr ("ClosePosBySortLots(): " + "p = " + p);
if (p > 0)
{
ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND);
for(i=0; i<p; i++)
{
if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES))
{
if (OrderCloseTime() == 0) ClosePosBySelect();
}
}
}
}
//+-------------------------------------------------------------------------------------+//| Закрытие одного, предварительно выбранного ордера |//+-------------------------------------------------------------------------------------+void ClosePosBySelect()
{
bool fc;
color clClose, clCloseBuy = Blue, clCloseSell = Red;
double ll, pa, pb, pp;
int err, it, NumberOfTry = 3;
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
for (it=1; it<=NumberOfTry; it++)
{
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa = MarketInfo(OrderSymbol(), MODE_ASK);
pb = MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType() == OP_BUY)
{
pp = pb; clClose = clCloseBuy;
}
else
{
pp = pa; clClose = clCloseSell;
}
ll = OrderLots();
fc = OrderClose(OrderTicket(), ll, pp, 30, clClose);
if (fc)
{
break;
}
else
{
err = GetLastError();
}
}
}
elsePrint("Некорректная торговая операция. Close ");
}
Aus irgendeinem Grund werden einige der Aufträge nicht abgeschlossen. Ich drucke einige Segmente aus, wenn ich sie sehe, verstehe ich nichts. Hier ist ein Beispiel:
Der Kommentar zeigt an, dass lastOOTHist = 01:30:00 ist, obwohl dies eigentlich nicht korrekt ist. Wenn wir lastOOTHist im Ergebnisfenster überprüfen, werden wir sehen, dass
Ja, das ist tatsächlich sinnvoll. Sie haben auch einen Link hier...:)) Das hatte ich noch vom letzten Mal übrig, als die Parameter nicht global waren.
Ich habe argumentiert, dass das Array hier per Referenz übergeben werden muss. Andernfalls ist die Funktion dazu verdammt, nur mit einem einzigen, fest kodierten Array zu arbeiten. Auch wenn Sie es global definiert haben.
Guten Tag!
Bitte helfen Sie mir und erklären Sie mir, warum der Expert Advisor nicht funktioniert oder nicht handelt?
Ja, diese Regelung ist übrigens intelligenter in der Umsetzung. Die zugehörige Funktion am Anfang nimmt nun mehr Platz ein. Das Ergebnis sah folgendermaßen aus:
Es gibt doch nichts zu optimieren, oder?
Ich meine, dass es viel bequemer ist, wenn es am Anfang gar nicht viel gibt. Und alles wird rein über Funktionen aufgerufen. Und beim letzten Mal stellte sich heraus, dass der Start alle möglichen Verschachtelungen von Hauptfunktionen und Überladungen von zusätzlichen Funktionen aufweist...
Und warum sollte man ein Array per Referenz übergeben, wenn man einen global deklarierten Array-Namen in einer Funktion verwendet? Vielleicht sollten Sie es so machen:
Und Sie können es ein wenig reduzieren:
Und was ist mit dem Aufruf von Start und der Anzeige von Nachrichten? Ich habe den Eindruck, dass sie etwas durcheinander gebracht haben. Wir können die Funktion pr() nicht sehen, also können wir nichts vorschlagen.
Ich habe die Anzahl der Aufträge im Testgerät mit einem schnellen Algorithmus überprüft:
Sie können die gesamte Ausgabe in eine Funktion verpacken, die Daten aus dem Array liest und die Informationen auf eine menschliche Art und Weise anzeigt.
Guten Tag!
Bitte helfen Sie und erklären, warum der EA nicht funktioniert oder Trades?
Denn hier. nicht alle Telepathen und nicht alle und Visionäre!
Ich verstehe!
Ich meine, gibt es eine Einstellung oder etwas anderes, das Sie brauchen?
Warum ein Array per Referenz übergeben, wenn Sie einen global deklarierten Array-Namen in der Funktion verwenden? Vielleicht sollte es so sein:
Ja, das ist tatsächlich sinnvoll. Aber auch hier übergeben Sie es per Referenz:)) Ich hatte es nach dem letzten Mal, als Parameter nicht global deklariert wurden.
Und über die pr-Funktion. Hier ist sie:
Ich verstehe!
Ich meine, gibt es eine Einstellung oder etwas anderes, das Sie brauchen?
Ich meine, ich glaube nicht, dass es hier irgendwelche Telepathen gibt, und selbst wenn, versuchen Sie einfach, sie für so ein Kunststück zu interessieren... Raten und helfen...
Ich meine, es gibt hier kaum Telepathen, und selbst wenn, solltest du versuchen, sie für solche Kunststücke zu begeistern... Raten und helfen...
Ich habe einen anhaltenden Stillstand bei der Schließung von benötigten Positionen. Die Quintessenz ist folgende:
1. Die Schließung von Positionen wird verfolgt.
2. Sobald die letzte Position auf dem Takeaway geschlossen wurde... ...sollten alle offenen und schwebenden Positionen sofort geschlossen werden. Alles wird nach Losen sortiert geschlossen, d.h. große Lose auf einmal, dann kleinere. Dies ist nur dazu gedacht, Erfahrungen mit Aufträgen zu sammeln.
Die Umsetzung erfolgt wie folgt:
In start() bei jedem Tick:
for (int ord=OrdersTotal()-1; ord>=0; ord--) { if (!OrderSelect(ord,SELECT_BY_POS)) continue; if (OrderMagicNumber() != i_magic) continue; if (OrderSymbol() != Symbol()) continue; if (OrderType() == 6) continue; g_ticket = OrderTicket(); g_type = OrderType(); // Блок модификации ордеров if (i_sl != 0 || i_tp != 0) { if (OrderStopLoss() == 0 && OrderTakeProfit() == 0) { OrdersModifyer(g_ticket); } } // Закрытие всех ордеров, если последний ордер закрыт if (isCloseByTakeLastOpenPos(2)) { // if (g_type < 2) { ClosePosBySortLots(); } //else if (g_type > 1) { DeletePendingOrders(g_ticket); } } }Wir sind an der Schließung von Marktaufträgen interessiert, da die anhängigen Aufträge bei Bedarf gelöscht werden. Hier ist, was wir haben:
Aus irgendeinem Grund werden einige der Aufträge nicht abgeschlossen. Ich drucke einige Segmente aus, wenn ich sie sehe, verstehe ich nichts. Hier ist ein Beispiel:
Der Kommentar zeigt an, dass lastOOTHist = 01:30:00 ist, obwohl dies eigentlich nicht korrekt ist. Wenn wir lastOOTHist im Ergebnisfenster überprüfen, werden wir sehen, dass
ihre Schließzeiten sind unterschiedlich...
Was ist hier falsch?
Ja, das ist tatsächlich sinnvoll. Sie haben auch einen Link hier...:)) Das hatte ich noch vom letzten Mal übrig, als die Parameter nicht global waren.
Es tut mir leid, dass ich am Ende der Woche gebraucht werde, aber ich werde fragen.
Hat jemand Erfahrung mit dem Lesen einer Nachricht in einer Mailbox von einem bekannten Absender?