Diese Funktion berechnet die Koordinaten des Schnittpunkts zweier Segmente, wobei jedes Segment durch ein Paar seiner Punktkoordinaten definiert ist. Drei Arrays werden als Parameter an die Funktion übergeben:
x - Feld der Abszisse. Muss vier Elemente enthalten: x[0], x[1] - Abszissen des ersten Segments, x[2], x[3] - Abszissen des zweiten Segments.
y - Ein Array von Ordinaten. Sollte vier Elemente enthalten: y[0], y[1] - Ordinaten des ersten Segments, y[0], y[1] - Ordinaten des zweiten Segments.
t - Array mit den Koordinaten des gesuchten Schnittpunkts. Nach der normalen Ausführung der Funktion enthält dieses Feld zwei Elemente: t[0] ist die Abszisse des Schnittpunkts der beiden Linien und t[1] die Ordinate desselben Punkts.
Das Ergebnis ist wahr, wenn sich die Segmente schneiden, und falsch, wenn sie es nicht tun. Wenn die Segmente ganz oder teilweise kongruent sind, gibt die Funktion false zurück.
//+----------------------------------------------------------------------------+//| Параметры: |//| x - массив абсцисс x[0], x[1] - первый отрезок |//| x[2], x[3] - второй отрезок |//| y - массив ординат y[0], y[1] - первый отрезок |//| y[0], y[1] - второй отрезок |//| t - массив искомых координат t[0] - абсцисса точки пересечения |//| t[1] - ордината точки пересечения |//| результат true если отрезки пересекаются |//| false если нет |//| примечание если отрезки не пересекаются, то в мас- |//| сив t[] передается точка пересечения |//| прямых, на которых лежат отрезки |//+----------------------------------------------------------------------------+bool CrossPointOfSections(double& x[],double& y[],double& t[]){double z=( y[3]- y[2])*( x[1]- x[0])-( y[1]- y[0])*( x[3]- x[2]);ArrayResize( t,2);ArrayInitialize( t,0.0);if( z==0){Print("CrossPointOfSections(): Не удалось найти точку пересечения!");return(false);}double xy1= x[1]* y[0]- x[0]* y[1];double xy2= x[3]* y[2]- x[2]* y[3];
t[0]=NormalizeDouble(( xy1*( x[3]- x[2])- xy2*( x[1]- x[0]))/ z,0);
t[1]=( xy1*( y[3]- y[2])- xy2*( y[1]- y[0]))/ z;if(( t[0]- x[0])*( t[0]- x[1])>0||( t[1]- y[0])*( t[1]- y[1])>0)return(false);if(( t[0]- x[2])*( t[0]- x[3])>0||( t[1]- y[2])*( t[1]- y[3])>0)return(false);return(true);}
Function isCloseLastPosByTake(). Diese Funktion gibt das Flag zum Schließen der letzten Position auf dem Take zurück. Flagge ist oben - Wahr - TakeProfit wurde ausgelöst. Flagge gesenkt - Falsch - Position wurde aus einem anderen Grund geschlossen
Gestern habe ich diese Frage im allgemeinen Forum gestellt. Aber bis jetzt keine Antwort.
Mein Expert Advisor hat ein 3-stufiges Martingal. Jede Stufe (Position) hat ihre eigene Magie (1,2,3).
Positionen werden durch Signale und/oder Stops geschlossen.
Diese Art des Abschlusses wird ebenfalls durchgeführt:
if( isCloseLastPosByStop(NULL,OP_BUY, Magic_3))//если посл. позиция //закрылась по тейкпрофиту, - то закрываем все позиции
ClosePosFirstProfit(NULL,OP_BUY,-1);
Es stellt sich heraus, dass mein Expert Advisor funktioniert gut, solange die letzte (größte Position) eines martigail Schritt ist nicht auf Take Profit geschlossen!
Wenn dann die nächste erste Position (magische 1) geöffnet wird, wird sie sofort geschlossen, da das Flag der Funktion isCloseLastPosByTake() auf eins (1) gesetzt bleibt!
Und so weiter bis ins Unendliche. Öffnet und schließt sich.
Außerdem! Das Terminal merkt sich diese Markierung, und selbst eine Neuinstallation des EA hilft nicht (bis Sie die Magie ändern).
Ich brauche eine Möglichkeit, die Funktion isCloseLastPosByTake() zurückzusetzen, nachdem alle Positionen geschlossen wurden.
Ich habe mir bereits das Hirn zermartert. Das klappt nicht!
Igor, oder wer auch immer (wer kann), bitte sagen Sie mir, wie es zu tun und wenn Sie es überhaupt tun können?
Beispiele für die Verwendung des Befehls ModifyOrder().
Ich habe beschlossen, die allerersten Beispiele zu nennen, die mir schon oft gestellt wurden. Dies ist die Eröffnung von Positionen im Rahmen der Ausführung von Marktaufträgen Market Watch. Dies ist der Fall, wenn wir nicht gleichzeitig einen Auftrag zur Eröffnung einer Position zum Marktpreis erteilen und einen schwebenden Auftrag damit verbinden können. Eine solche Eröffnung bei Market Watch sollte in zwei Schritten erfolgen: Zuerst eröffnen wir eine Position, und dann versehen wir sie mit einer Pending Order, d.h. wir setzen StopLoss und TakeProfit Kursniveaus.
1. Kaufen Sie 0,1 Lot des aktuellen Symbols und setzen Sie einen Stopp von 30 Punkten
2. Verkaufen Sie 0,15 Lot des aktuellen Symbols und setzen Sie SL=45, TP=99
int ti= OpenPosition(NULL,OP_SELL,0.15);if(OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1,Bid+45*Point,Bid-99*Point, clModifySell);
Ein Arbeitsskript mit Beispielen ist im Trailer enthalten.
Guten Morgen, Igor und Ihnen allen! Ich habe diese Funktionen in meinem EA angewendet. Alles wird gut geändert.
Solange ich in meinem EA keine Magie einsetze!
Alle Positionen ändern sich normal. Allerdings -
Ich verstehe nicht, warum die Funktion OpenPosition() den Zauberer nicht sieht und die Positionen nacheinander auf jedem Balken öffnet. Ich habe bereits alles Unnötige entfernt (ich dachte, es sei mein Fehler im Code).
Und geben Sie die Anzahl der Positionen im Kommentar an. Es ist nutzlos. Wenn es offensichtliche Positionen gibt - Kommentar druckt Null:
Ich kann mir nicht erklären, warum die Funktion den Zauberer nicht sehen kann! Hier ist der Code:
externint Magic =7771;externint StopLoss =200;externint TakeProfit_Sell =200;externdouble Lots_1 =0.01;//размер лота//--------------------------------------------------------------------+externstring _P_Performance ="- Параметры открытия позиций ";externbool UseSound = True;//Использовать звуковой сигналexternstring NameFileSound ="expert.wav";//Наименование зву. файла откр.color clOpenBuy =Blue;// Цвет значка открытия покупкиcolor clOpenSell =Red;// Цвет значка открытия продажиcolor clModifyBuy =Aqua;// Цвет значка модификации покупкиcolor clModifySell =Tomato;// Цвет значка модификации продажиint Slippage =10;// Проскальзывание ценыint NumberOfTry =10;// Количество попыток//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж//-- Подключаемые модули --#include <stderror.mqh>#include <stdlib.mqh>//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжbool gbDisabled = False;// Флаг блокировки советникаdouble SL, TP;int ti;staticint prevtime =0;//------------------------------------------------------------int start(){Comment("Количество откр. позиций = ", NumberOfPositions(NULL,OP_SELL, Magic));if(Time[0]== prevtime)return(0);//ждём появления нового бара
prevtime =Time[0];//если появился новый бар , включаемся//XXXXXXXXXXXXXXXXXXX ОТКРЫТИЕ ПОЗИЦИЙ ХХХХХХХХХХХХХХif( NumberOfPositions(NULL,OP_SELL, Magic)<1){//если нет открытых селл-// позиций
SL=0; TP=0;// задаем стопыif( StopLoss>0) SL=Bid+Point* StopLoss;if( TakeProfit_Sell>0) TP=Bid-Point* TakeProfit_Sell;//Открываем позицию селл
ti= OpenPosition(NULL,OP_SELL, Lots_1, Magic);if(OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, SL, TP, clModifySell);}return(0);//-----------------Конец функции int start()-------------------------}// Пользовательские функции жжжжжжжжжжжжжжжжжжжжжжжжж
//Здесь только названия. Полный код ф-й - ниже в аттаче
void Message(string m)//вывод сообщ в коммент и принтint NumberOfPositions(string sy="",int op=-1,int mn=-1)//кол-во позицийstring GetNameOP(int op)//торг. операцияint OpenPosition(string sy,int op,double ll,double sl=0,double tp=0,int mn=0)void ModifyOrder(double pp=-1,double sl=0,double tp=0,color cl=CLR_NONE)string GetNameTF(int TimeFrame=0)//таймфреймbool ExistPositions(string sy="",int op=-1,int mn=-1,datetime ot=0)//флаг сущ.
Im Anhang finden Sie die Quelldatei dieses Codes. Können Sie mir bitte sagen, wo ich einen Fehler gemacht habe und warum EA keine Magie sieht?
Bei der Verwendung von OrderCloseBuy - OrderCloseSell benötigt die integrierte MKueL-Sprache und der Compiler zwei Funktionsparameter(Auftragstickets - Kauf und Verkauf). Wir haben ein Ticket für eine offene Bestellung, aber wie können wir das zweite Ticket einstellen? Oder vielleicht habe ich etwas nicht verstanden - im Selbststudium der Sprache steht nichts über diese Funktion und es gibt kein Beispiel.
Haben Sie eine separate benutzerdefinierte (oder andere) Funktion erstellt, um die Kauf-/Verkaufsposition umzukehren und umgekehrt, ohne die übliche OrderClose-OrderSend?
Die Funktion CrossPointOfSections().
Diese Funktion berechnet die Koordinaten des Schnittpunkts zweier Segmente, wobei jedes Segment durch ein Paar seiner Punktkoordinaten definiert ist. Drei Arrays werden als Parameter an die Funktion übergeben:
Das Skript ist zum Testen gedacht.
Guten Tag. Frage zu Funktionen, die eine Flagge zum Schließen der letzten Position bei einem Take oder Stop Loss zurückgeben.
Nützliche Funktionen von KimIV".
Function isCloseLastPosByTake().
Diese Funktion gibt das Flag zum Schließen der letzten Position auf dem Take zurück. Flagge ist oben - Wahr - TakeProfit wurde ausgelöst. Flagge gesenkt - Falsch - Position wurde aus einem anderen Grund geschlossen
//---------------------------------------------------------------
Gestern habe ich diese Frage im allgemeinen Forum gestellt. Aber bis jetzt keine Antwort.
Mein Expert Advisor hat ein 3-stufiges Martingal. Jede Stufe (Position) hat ihre eigene Magie (1,2,3).
Positionen werden durch Signale und/oder Stops geschlossen.
Diese Art des Abschlusses wird ebenfalls durchgeführt:
Es stellt sich heraus, dass mein Expert Advisor funktioniert gut, solange die letzte (größte Position) eines martigail Schritt ist nicht auf Take Profit geschlossen!
Wenn dann die nächste erste Position (magische 1) geöffnet wird, wird sie sofort geschlossen, da das Flag der Funktion isCloseLastPosByTake() auf eins (1) gesetzt bleibt!
Und so weiter bis ins Unendliche. Öffnet und schließt sich.
Außerdem! Das Terminal merkt sich diese Markierung, und selbst eine Neuinstallation des EA hilft nicht (bis Sie die Magie ändern).
Ich brauche eine Möglichkeit, die Funktion isCloseLastPosByTake() zurückzusetzen, nachdem alle Positionen geschlossen wurden.
Ich habe mir bereits das Hirn zermartert. Das klappt nicht!
Igor, oder wer auch immer (wer kann), bitte sagen Sie mir, wie es zu tun und wenn Sie es überhaupt tun können?
Die Antwort auf meine Frage scheint gefunden worden zu sein. Wenn Sie daran interessiert sind, finden Sie es hier.
Eine Frage für Kenner".
Beispiele für die Verwendung des Befehls ModifyOrder().
Ich habe beschlossen, die allerersten Beispiele zu nennen, die mir schon oft gestellt wurden. Dies ist die Eröffnung von Positionen im Rahmen der Ausführung von Marktaufträgen Market Watch. Dies ist der Fall, wenn wir nicht gleichzeitig einen Auftrag zur Eröffnung einer Position zum Marktpreis erteilen und einen schwebenden Auftrag damit verbinden können. Eine solche Eröffnung bei Market Watch sollte in zwei Schritten erfolgen: Zuerst eröffnen wir eine Position, und dann versehen wir sie mit einer Pending Order, d.h. wir setzen StopLoss und TakeProfit Kursniveaus.
1. Kaufen Sie 0,1 Lot des aktuellen Symbols und setzen Sie einen Stopp von 30 Punkten
2. Verkaufen Sie 0,15 Lot des aktuellen Symbols und setzen Sie SL=45, TP=99
Ein Arbeitsskript mit Beispielen ist im Trailer enthalten.
Solange ich in meinem EA keine Magie einsetze!
Alle Positionen ändern sich normal. Allerdings -
Ich verstehe nicht, warum die Funktion OpenPosition() den Zauberer nicht sieht und die Positionen nacheinander auf jedem Balken öffnet. Ich habe bereits alles Unnötige entfernt (ich dachte, es sei mein Fehler im Code).
Und geben Sie die Anzahl der Positionen im Kommentar an. Es ist nutzlos. Wenn es offensichtliche Positionen gibt - Kommentar druckt Null:
Ich kann mir nicht erklären, warum die Funktion den Zauberer nicht sehen kann! Hier ist der Code:
Im Anhang finden Sie die Quelldatei dieses Codes. Können Sie mir bitte sagen, wo ich einen Fehler gemacht habe und warum EA keine Magie sieht?
Ja, ich danke Ihnen allen(tmp.0 & Roger)! Ich habe das Problem behoben und alles funktioniert wieder wie es soll.
Meine Unaufmerksamkeit ist daran schuld. Überhaupt nicht die Funktion OpenPosition().
Spieler, ein Hinweis!
Bei der Verwendung von OrderCloseBuy - OrderCloseSell benötigt die integrierte MKueL-Sprache und der Compiler zwei Funktionsparameter(Auftragstickets - Kauf und Verkauf). Wir haben ein Ticket für eine offene Bestellung, aber wie können wir das zweite Ticket einstellen? Oder vielleicht habe ich etwas nicht verstanden - im Selbststudium der Sprache steht nichts über diese Funktion und es gibt kein Beispiel.
Vielen Dank im Voraus!
Und hier eine weitere Frage an Igor.
Haben Sie eine separate benutzerdefinierte (oder andere) Funktion erstellt, um die Kauf-/Verkaufsposition umzukehren und umgekehrt, ohne die übliche OrderClose-OrderSend?