Fonctions utiles de KimIV - page 91

 

La fonction CrossPointOfSections().

Cette fonction calcule les coordonnées du point d'intersection de deux segments. Chaque segment est défini par une paire de ses coordonnées ponctuelles. Trois tableaux sont passés à la fonction comme paramètres :

  • x - Tableau d'abscisses. Doit contenir quatre éléments : x[0], x[1] - abscisses du premier segment, x[2], x[3] - abscisses du second segment.
  • y - Un tableau d'ordonnées. Doit contenir quatre éléments : y[0], y[1] - ordonnées du premier segment, y[0], y[1] - ordonnées du second segment.
  • t - Tableau de coordonnées du point d'intersection que vous recherchez. Après l'exécution normale de la fonction, ce tableau contiendra deux éléments : t[0] est l'abscisse du point de croisement des deux lignes et t[1] est l'ordonnée du même point.
  • Le résultat est vrai si les segments se croisent, faux s'ils ne se croisent pas. Si les segments sont congruents, totalement ou partiellement, la fonction retournera faux.
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    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);
}

Ce script est destiné à être testé.

Dossiers :
 
Merci.
 

Bon après-midi. Question sur les fonctions qui renvoient un drapeau pour fermer la dernière position à une prise ou un stop loss.

Fonctions utiles de KimIV.

Fonction isCloseLastPosByTake().
Cette fonction renvoie l'indicateur de fermeture de la dernière position sur la prise. Le drapeau est levé - Vrai - TakeProfit a été déclenché. Drapeau abaissé - Faux - le poste a été fermé pour une autre raison.

//---------------------------------------------------------------

Hier, j'ai posé cette question sur le forum général. Mais jusqu'à présent, pas de réponse.

Mon conseiller expert a une martingale en 3 étapes. Chaque étape (position) a sa propre magie (1,2,3).

Les positions sont fermées par des signaux et/ou des stops.

Ce type de fermeture est également mis en œuvre :

if ( isCloseLastPosByStop(NULL, OP_BUY, Magic_3)) //если посл. позиция 
//закрылась по тейкпрофиту, - то закрываем все позиции
 ClosePosFirstProfit(NULL,OP_BUY, -1);   

Il s'avère que mon conseiller expert fonctionne bien tant que la dernière (plus grande position) d'une étape de martigues n'est pas fermée au moment du Take Profit!

Ensuite, lorsque la première position suivante (magique 1) est ouverte, elle est fermée immédiatement, car le drapeau de la fonction isCloseLastPosByTake() reste positionné sur un (1) !

Et ainsi de suite jusqu'à l'infini. S'ouvre et se ferme.

De plus ! Le terminal se souvient de ce drapeau et même une nouvelle suppression/installation de l'EA n'aide pas (jusqu'à ce que vous changiez de magiks).

J'ai besoin d'un moyen de réinitialiser la fonction isCloseLastPosByTake() après la fermeture de toutes les positions.

Je me suis déjà tordu le cerveau à l'envers. Ça ne marchera pas !

Igor !, ou quiconque (qui le peut), veuillez me dire comment faire et si vous pouvez le faire ?




 

La réponse à ma question semble avoir été trouvée. Si vous êtes intéressé, c'est ici.

Une question pour les connaisseurs.

 
KimIV >> :

Exemples d'utilisation de la fonction ModifyOrder().

J'ai décidé de donner les tout premiers exemples que l'on m'a déjà demandés à maintes reprises. Il s'agit de l'ouverture de positions en termes d'exécution d'ordres de marché Market Watch. C'est lorsque nous ne pouvons pas simultanément donner un ordre d'ouverture de position au prix du marché et y attacher un ordre en attente. Une telle ouverture sur Market Watch doit être effectuée en deux étapes : d'abord, nous ouvrons une position, puis nous y attachons un ordre en suspens, c'est-à-dire que nous fixons des niveaux de prix StopLoss et TakeProfit.

1. Acheter 0,1 lot du symbole actuel et fixer un stop de 30 points

2. Vendez 0,15 lot du symbole actuel et fixez un 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);

Un script de travail avec des exemples est inclus dans la remorque.





Bonjour à Igor et à vous tous ! J'ai appliqué ces fonctions dans mon EA. Tout se modifie bien.

Tant que je n'ai pas mis dans mon EA un magik !

Toutes les positions se modifient normalement. Cependant -

Je ne comprends pas pourquoi la fonction OpenPosition() ne voit pas le magicien et continue à ouvrir des positions une par une sur chaque barre. J'ai déjà supprimé toutes les choses inutiles (je pensais que c'était mon erreur dans le code).

Et mettez le nombre de postes dans le commentaire. C'est inutile. Quand il y a des positions évidentes - le commentaire imprime zéro :


Je n'arrive pas à comprendre pourquoi la fonction ne peut pas voir le magicien ! Voici le 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)//флаг сущ.

Vous trouverez ci-joint le fichier source de ce code. Pouvez-vous me dire où j'ai fait une erreur et pourquoi EA ne voit pas la magik ?

Dossiers :
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);
 
Savez-vous que dans votre version, il ne vérifie que les ordres de vente?
Je l'ai trouvé, vous n'envoyez que quatre paramètres à la fonction d'ouverture de position, alors qu'il en faut 6.
 

Oui, merci à tous(tmp.0 & Roger) ! Je l'ai réparé et tout fonctionne comme il se doit.

Mon inattention est à blâmer. Pas du tout la fonction 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);
 

Joueur, un indice !

Lors de l'utilisation de OrderCloseBuy - OrderCloseSell, le langage et le compilateur MKueL intégrés nécessitent deux paramètres de fonction(tickets de commande - achat et vente). Nous avons un ticket pour un ordre ouvert, mais comment pouvons-nous définir le second ? Ou peut-être que je n'ai pas compris quelque chose - l'auto-apprentissage du langage n'a rien écrit sur cette fonction et n'a pas d'exemple.

Merci d'avance !

 

Et voici une autre question pour Igor.

Avez-vous créé une fonction personnalisée distincte (ou autre) pour inverser la position d'achat et de vente et vice versa, sans l'habituel OrderClose-OrderSend ?

Raison: