KimIV的有用功能 - 页 91

 

CrossPointOfSections()函数。

这个函数计算两个线段的交点坐标。 每个线段由一对点坐标定义。三个数组作为参数被传递给函数。

  • x- 尾数阵列。必须包含四个 元素:x[0],x[1]- 第一段的分水岭,x[2],x[3]- 第二段的分水岭。
  • y- 一个数组的坐标。应该包含四个 元素:y[0],y[1]- 第一段的坐标,y[0],y[1]- 第二段的坐标。
  • t- 你要找的交叉点的坐标阵列。在函数正常执行后,这个数组将包含两个 元素:t[0] 是两条线的交叉点的标线,t[1] 是同一点的序数。
  • 如果两段相交,结果为,如果不相交,结果为。如果片段完全或部分全等,该函数将返回错误
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    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);
}

这个脚本是用来测试的。

附加的文件:
 
谢谢你。
 

下午好。关于返回标志的函数的问题,即在采取或停止损失时关闭最后的头寸。

'来自KimIV的有用功能'。

函数isCloseLastPosByTake()。
该函数返回关闭最后一个位置的标志Flag is up - True - TakeProfit has triggered.标记降低 - 错 - 职位因其他原因被关闭

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

昨天我在普通论坛上问了这个问题。但到目前为止还没有答案。

我的专家顾问有一个3步法的马汀格。每个步骤(位置)都有自己的魔力(1,2,3)。

仓位通过信号和/或止损来关闭。

这种类型的关闭也被实施。

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

事实证明,我的专家顾问工作得很好,直到边际的最后一个(最大的头寸)在获利时被关闭!我的专家顾问工作得很好

然后,当下一个第一个位置(神奇的1)被打开时,它被立即关闭,因为isCloseLastPosByTake() 函数标志保持设置为一(1) !

就这样到了无穷大。打开和关闭。

此外!终端会记住这个标志,即使重新删除/安装EA也没有帮助(直到你改变magiks)。

我需要一些方法,在所有头寸关闭后重置isCloseLastPosByTake() 函数。

我已经把我的大脑扭曲了。它不会起作用!

Igor !, 或者谁(可以),请告诉我如何做,如果你能做到这一点?




 

我的问题的答案似乎已经找到了。如果你有兴趣,就在这里。

'给鉴赏家的问题'。

 
KimIV >> :

如何使用ModifyOrder()函数的例子。

我决定举出以前被问过很多次的最开始的例子。这是在市场订单执行方面的开仓行为 市场观察。它是指我们不能同时下达按市场价格开仓的指令,并将一个挂单附在上面。在Market Watch上的这种开仓应该分两个阶段进行:首先,我们开一个头寸,然后给它附加一个挂单,即我们设置StopLoss和TakeProfit价格水平。

1.买入当前符号的0.1手并设定30点的止损。

2.卖出当前符号的0.15手,设置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);

预告片中包括一个带有实例的工作脚本。





祝伊戈尔和所有的人早上好!我已经在我的EA中应用了这些功能。一切都修改的很好。

只要我没有在我的EA里放一个魔力!

所有位置都正常修改。然而--

我不明白为什么OpenPosition()函数没有看到这个魔术师,而是一直在每个柱子上一个一个地开仓。 我已经删除了所有不必要的东西(我以为是我在代码中的错误)。

并在评论中写上职位的数量。 它是无用的。当有明显的位置时--评论打印为零。


我不明白为什么功能不能看到魔术师!下面是代码。
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)//флаг сущ.

附上该代码的源文件。你能告诉我,我在哪里犯了错误,为什么EA看不到magik?

附加的文件:
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);
 
你是否知道在你的版本中,它只检查卖出的订单
我发现,你只向开仓函数发送了四个参数,而你需要六个。
 

是的,谢谢大家(tmp.0&Roger)!修复了它,一切都在正常工作。

我的注意力不集中是有原因的。根本就不是 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);
 

球员,给你一个提示!

当使用OrderCloseBuy - OrderCloseSell时,内置的MKueL语言和编译器需要两个函数参数(订单票--买和卖)。我们有一张未结订单的票,但我们如何设置第二张票?或者是我没有理解到什么--语言自学中没有写到这个功能,也没有例子。

提前感谢您!

 

这里还有一个问题要问伊戈尔。

你是否创建了一个单独的自定义(或其他)函数来翻转买入-卖出头寸,反之亦然,而不使用通常的OrderClose-OrderSend?