KimIVの便利な機能 - ページ 91

 

CrossPointOfSections()関数です。

この関数は、2つのセグメントの交点の座標を計算します。 各セグメントは、その点座標の組で定義されます。3つの配列がパラメータとして関数に渡されます。

  • x- 横座標の配列.x[0],x[1]- 第1セグメントの横軸,x[2],x[3]- 第2セグメントの横軸, の4つの 要素を含む必要があります。
  • y- 座標の配列.y[0],y[1]- 第1セグメントの座標,y[0],y[1]- 第2セグメントの座標, の4つの 要素を含みます。
  • t- 探索する交点の座標の配列.関数が正常に実行されると,この配列には2つの 要素が含まれます.t[0] は2つの直線の交点の横座標,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().
テイク上の最後のポジションをクローズするフラグを返しますフラグが立っている - True - TakeProfitが発動されました。フラグを下げた - False - その他の理由でポジションがクローズされた

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

昨日、一般フォーラムでこんな質問をしました。しかし、今のところ答えはない。

私のExpert Advisorには3段階のマーチンゲールがあります。各ステップ(ポジション)には、それぞれのマジック(1,2,3)があります。

ポジションはシグナルやストップで決済されます。

このような閉め方も実施されています。

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

私のExpert Advisorは、マーティゲールステップの最後の(最大の)ポジションがTake Profitでクローズされない限り、うまく機能する ことが判明しました。

そして、次の最初の位置(マジック1)が開かれると、isCloseLastPosByTake( )関数のフラグが1(1)のままなので、すぐに閉じられます !

そして、無限大に。開いたり閉じたりする。

さらに!ターミナルがこのフラグを記憶しており、EAを新たに削除/インストールしても(Magiksを変更するまで)役に立ちません。

すべてのポジションがクローズされた後、isCloseLastPosByTake() 関数をリセットする方法が必要です。

もう、脳みそが裏返るほどひねくれてるんですよ。うまくいかない!?

イゴール!、または誰か(できる人)、どうすればいいのか、全くできないのか、教えてください。




 

私の疑問に対する答えが見つかったようです。ご興味のある方は、こちらへどうぞ。

目利きのための質問」。

 
KimIV >> :

ModifyOrder()関数の使用例です。

これまで何度も聞かれたことのある、まさにその例を挙げることにしたのです。成行注文の実行という意味でのポジションのオープンです。 マーケットウォッチそれは、市場価格でポジションを建てる注文と、それに付随する保留注文を同時に出すことができない場合である。まず、ポジションを建て、そのポジションに注文を付け、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()関数が魔法使いに気づかず、すべてのバーでポジションを1つずつオープンし続けるのはなぜでしょうか? すでに不要なものはすべて削除しています(コードの私のミスだと思いました)。

そして、コメントにはポジションの数を入れてください。 無駄なことです。明らかなポジションがある場合 - コメントはゼロを印刷します。


なぜ機能がマジシャンに見えないのかがわからない!以下はそのコードです。
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にマジコンが表示されないのか、教えてください。

ファイル:
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);
 
あなたのバージョンでは、売り注文しか チェックされないことをご存知ですか?
発見しました!ポジションオープン機能には6つのパラメータが必要なのに、4つのパラメータしか送っていないのです。
 

はい、皆さん(tmp.0Roger)ありがとうございました!修正し、すべてが正常に動作するようになりました。

私の不注意が原因です。 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 言語とコンパイラは、2 つの関数パラメータ(注文チケット- buy と sell)を要求します。オープンオーダーのチケットは1枚ですが、2枚目はどのように設定すればいいのでしょうか?あるいは、私が何か理解していなかったのかもしれません。言語の自習書には、この関数について何も書かれておらず、例もありません。

ありがとうございました。

 

そして、ここでもイゴールさんに質問です。

通常のOrderClose-OrderSendを使わずに、買いポジションと 売りポジションを反転 させる別のカスタム(または他の)関数を作成しましたか?