Nützliche Funktionen von KimIV - Seite 91

 

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:

  • 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);
}

Das Skript ist zum Testen gedacht.

Dateien:
 
Ich danke Ihnen.
 

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:

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?




 

Die Antwort auf meine Frage scheint gefunden worden zu sein. Wenn Sie daran interessiert sind, finden Sie es hier.

Eine Frage für Kenner".

 
KimIV >> :

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:
extern int        Magic           = 7771;
extern int        StopLoss        =200;
extern int        TakeProfit_Sell =200;
extern double     Lots_1          = 0.01;//размер лота
//--------------------------------------------------------------------+
extern string _P_Performance = "- Параметры открытия  позиций ";
extern bool       UseSound      = True;        //Использовать звуковой сигнал
extern string     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;
static int 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?

Dateien:
exp.sell.rar  4 kb
 
if( StopLoss>0)   SL=Bid+Point* StopLoss;
if( TakeProfit_Sell>0) TP=Bid-Point* TakeProfit_Sell; 
//Открываем позицию селл  
 //ti=OpenPosition(NULL, OP_SELL, Lots_1,Magic);  Ваш маджик шел в качестве стоп-лосса
 ti= OpenPosition(NULL, OP_SELL, Lots_1, SL, TP, Magic);
 
Ist Ihnen bewusst, dass in Ihrer Version nur auf Verkaufsaufträge geprüft wird?
Ich habe herausgefunden, dass Sie nur vier Parameter an die Positionseröffnungsfunktion senden, während Sie 6 benötigen.
 

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().

SL=0; TP=0;
if( StopLoss>0)   SL=Bid+Point* StopLoss;
if( TakeProfit>0) TP=Bid-Point* TakeProfit;   
ti= OpenPosition(NULL, OP_SELL, Lots,0,0, Magic);
if (OrderSelect( ti, SELECT_BY_TICKET))
  ModifyOrder(-1, SL, TP, clModifySell);
 

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?

Grund der Beschwerde: