初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 70

 
こんにちは、MT4での関数の書き方について教えてください。私は自分の口座残高を知って いる、私は多くの取引が開かれる(例えば9)、私はリスク(例えば、口座残高の3%)を知っている、私はそれぞれの次のロットが倍増し、すべての取引が互いに重複する場合、最初の取引のためにロットを計算する必要があります。
//Функция расчета торгового лота
double GetLots()
{
 double clots = 0.0;
 double cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2); 
 double L2 = NormalizeDouble(cl * Multipler,2);
 double L3 = NormalizeDouble(L2 * Multipler,2);
 double L4 = NormalizeDouble(L3 * Multipler,2);
 double L5 = NormalizeDouble(L4 * Multipler,2);
 double L6 = NormalizeDouble(L5 * Multipler,2);
 double L7 = NormalizeDouble(L6 * Multipler,2);
 double L8 = NormalizeDouble(L7 * Multipler,2);
 double L9 = NormalizeDouble(L8 * Multipler,2);
 
 for(cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2);AccountFreeMarginCheck(Symbol(),OP_BUY,L9) <= (AccountBalance()/100)*Risk;cl--)
 {
  if(!IsStopped()) 
  {
   clots = NormalizeDouble(cl,2);
  }
 } 
 return(clots);
}

これが、私が手に入れたものです。何が問題なのか、教えてください。ありがとうございました。

 

こんにちは。

mq4には誰もいないようなので、ここに書きます。

何が間違っているのか、教えてください。オプション2が機能しない。

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two
 
Arseniy Barudkin:
こんにちは、MT4で関数を書きたいのですが、よろしくお願いします。私は自分の口座残高を知って いる、私は多くの取引が開かれる(例えば9)、私はリスク(例えば、口座残高の3%)を知っている、私はそれぞれの次のロットが倍増し、すべての取引が互いに重複する場合、最初の取引のためにロットを計算する必要があります。

これが、私が手に入れたものです。何が問題なのか、教えてください。ありがとうございました。

初級編。エラーはGetLots() 関数です。機能全体。
 
Leo59:

こんにちは。

mq4には誰もいないようなので、ここに書きます。

何が間違っているのか、教えてください。オプション2が機能しない。

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two

ハイライト:代入 - "="があるべきで、比較 - "=="があります。

 

皆さん、こんにちは。
私はmt4でロボットを書くことを学んでいる、私はバイナリーオプションで開始することを決めた。簡単なEAを書いているのですが、コンパイラがたくさんの警告を出すので、理解できません(
ヘルプ:「おMQL4達人」 =))))))
ありがとうございました!)

以下は、そのEAのコードです。

//+------------------------------------------------------------------+
//|Bolinger_Bands_traider。mq4|(エムキューブ
//|Copyright 2017, Penrov Nikolay|ペンロフ・ニコライ。
//|vkcom/buzamonolit|電子書籍で漫画(マンガ)を読むならコミック.jp
//+------------------------------------------------------------------+
#property copyright "著作権 2017, Petrov Nikolay"
#property link "vk.com/buzamonolit"
#property version "1.00"
#プロパティの厳密さ
//+------------------------------------------------------------------+
//|エキスパート初期化関数|
//+------------------------------------------------------------------+
extern int Bolinger_Bands = 20; //ボリンジャーバンドの 周期
extern double Delta = 0.0003; // どの距離で注文を出すか

string Symb; // 金融商品の名前。
int Total; // 注文数

//+------------------------------------------------------------------+
//|エキスパート初期化関数|
//+------------------------------------------------------------------+
int init()
{
//----
Initialize_Objects(0)です。
//----
return(0)です。
}
//+------------------------------------------------------------------+
//|エキスパート初期化関数|
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0)です。
}
//+------------------------------------------------------------------+
//|エキスパートスタート機能|
//+------------------------------------------------------------------+
int start()
{
//----
二重価格 = Bid;
double CurrBol_High = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_UPPER, 0)です。
double CurrBol_Low = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_LOWER, 0);
double PriceBol_High = price - CurrBol_High;
double PriceBol_Low = price - CurrBol_Low;
datetime NextClose = Time[0] + Period()*60*2;
int MinutesToNextClose = (NextClose - TimeCurrent())/60 + 1;
int err;

// オーダーカウント
Symb=Symbol()です。// フィンの名前。symbol(); // symbol(); // order icon(); // symbol().
合計=0;// 注文数
for(int i=1; i<=OrdersTotal(); i++) // オーダーループ
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // 次がある場合
{// オーダー解析。
if (OrderSymbol()!=Symb)continue; // 当社の金融商品ではありません。
if (OrderType()>1)// 注文を保留しています
{
Alert("未決済注文を検出しました。 Expert Advisorは動作していません。")
return(0)です。// Exit()
}
トータル+α。// カウンターマーケット言いつけ
if (Total>1)// 複数のオーダーは不可
{
Alert("Several market orders. Expert Advisor is not working.");
return(0)です。// Exit()
}
}
}

ObjectSetText("Obj_Label", "TF" + Period() + ", " + DoubleToStr(price, 5) + ", tick " + TimeToStr(TimeCurrent(), TIME_SECONDS) + ", O@")+ TimeToStr(Time[0], TIME_MINUTES) + ", NC@".+ TimeToStr(NextClose, TIME_MINUTES) + " (" + MinutesToNextClose + " min)", 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label2", "Orders:" + Total + ", delta " + DoubleToStr(Delta,5) + ", distance to MA:" + DoubleToStr(PriceBol_High,5), 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label3", "Orders: " + Total + ", Delta " + DoubleToStr(Delta,5) + ", distance to MA:" + DoubleToStr(PriceBol_Low, 5), 10, "Arial", DarkGreen).


// 価格分析と注文の開始

if ((MathAbs(PriceBol_Low) < Delta) && (price > CurrBol_Low) && (Open[0] > CurrBol_Low+Delta) && (Total<1)))
{
if (OrderSend(Symbol(), OP_BUY, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Green) >0) Print ("Open OK");
さもなくば
{
err=GetLastError()です。
Print("エラー(",err,"));
return(0)です。

}
Print ("CALL @ " + price + " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);

}

if ((MathAbs(PriceBol_High) < Delta) && (price < CurrBol_High) && (Open[0] < CurrBol_High-Delta) && (Total<1)))
{
if (OrderSend(Symbol(), OP_SELL, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Red) > 0) Print ("Open OK");
さもなくば
{
err=GetLastError()です。
Print("エラー(",err,"));
return(0)です。

}
Print ("PUT @ " + price + " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);

}

//----
return(0)です。
}
//+------------------------------------------------------------------+

int Initialize_Objects(int Win) // ユーザーフィー
{// .オブジェクトの作成
ObjectCreate("Obj_Label",OBJ_LABEL, Win, 0,0); // オブジェクトの作成
ObjectSet("Obj_Label", OBJPROP_CORNER, 0); // コーナーにバインドされます。
ObjectSet("Obj_Label", OBJPROP_XDISTANCE, 13); // X座標
if (Win==0)
ObjectSet("Obj_Label",OBJPROP_YDISTANCE, 15);//Y 座標
さもなくば
ObjectSet("Obj_Label",OBJPROP_YDISTANCE,15);//Y座標

ObjectCreate("Obj_Label2",OBJ_LABEL,Win, 0,0); // オブジェクトの作成
ObjectSet("Obj_Label2",OBJPROP_CORNER, 0); // コーナーへのバインディング
ObjectSet("Obj_Label2", OBJPROP_XDISTANCE, 13); // X座標
if (Win==0)
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Y座標
さもなくば
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Y 座標設定

ObjectCreate("Obj_Label3",OBJ_LABEL, Win, 0,0); // オブジェクトを作成します。
ObjectSet("Obj_Label3",OBJPROP_CORNER, 0); // コーナーへのバインディング
ObjectSet("Obj_Label3", OBJPROP_XDISTANCE, 13); // X座標
if (Win==0)
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Y座標
さもなくば
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Y 座標設定

return(0)です。// ユーザーから退出する。機能
}

 

以下、注意事項です。何が嫌なのか解らない(


型変換によりデータが失われる可能 性がある Bolinger_Bands_traider.mq4 51 24
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 76 35
number' から 'string' への暗黙の変換 Bolinger_Bands_traider.mq4 76 227
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 77 43
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 78 43
文字列'から'数値'への暗黙の変換 Bolinger_Bands_traider.mq4 85 71
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 93 23
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 93 91
文字列'から'数値'への暗黙の変換 Bolinger_Bands_traider.mq4 99 72
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 107 23
number' から 'string' への暗黙の変換 Bolinger_Bands_traider.mq4 107 91
エラー 0 件、警告 11 件、コンパイル時間 204 msec 1 12

 
Vitalie Postolache:
初級編。エラーはGetLots() 関数です。機能全体。

もしかしたら、正しい書き方を教えてくれるかもしれません。最大ロットからブルートフォースでループを使った計算をしたかった。
 
Arseniy Barudkin:

もしかしたら、正しい書き方を教えてくれるかもしれません。最大ロットから試行し、ループで計算したかった。


論理はどこにあるのか?最初の注文で最大許容ロットを設定し、連続した注文のたびにそれを増やしていくのです。控えめに言って、あまり賢明とは言えないと思いませんか?

さらに、ループ内の最初の注文のロットを、全く理解できない方法で減少させますが、その前に「計算」された他の注文のロットは変化せず、これらの値はこの関数の限界を超えることはありません。じゃあ、どうするんだ?

インクリメントループは実数ではだめで、カウンタ、整数でなければならないことは言うまでもない。しかし、ロット値をカウンタとして設定し、反復するたびにそこから1ずつ減算していくのです。これは大きな間違いであり、非常に重大なことです。

まず頭の中でロジックを明確にしてから、コードに実装してみてください。

 
bog_v_nas:

しかし、ここで注意事項があります。何が嫌なのか理解できない(


型変換によりデータが失われる可能 性がある Bolinger_Bands_traider.mq4 51 24
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 76 35
number' から 'string' への暗黙の変換 Bolinger_Bands_traider.mq4 76 227
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 77 43
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 78 43
文字列'から'数値'への暗黙の変換 Bolinger_Bands_traider.mq4 85 71
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 93 23
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 93 91
string' から 'number' への暗黙の変換 Bolinger_Bands_traider.mq4 99 72
数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 107 23
number' から 'string' への暗黙の変換 Bolinger_Bands_traider.mq4 107 91
エラー 0 件、警告 11 件、コンパイル時間 204 msec 1 12

エラー" タイプ変換によるデータ損失の可能性 Bolinger_Bands_traider.mq4 51 24" を理解するためにここではカウントしないので、51番で1行出力してください。

残りは「'数値'から'文字列'への暗黙の変換 Bolinger_Bands_traider.mq4 107 91

オブジェクトを作成する場所で、数値をテキスト文字列に変換する - たとえば、テキスト文字列。

ピリオド

はず

DoubleToString(Period(),0)です。

 
Renat Akhtyamov:

は,数値をテキスト文字列に変換し,テキスト文字列オブジェクトを作成します.

ピリオド

はず

DoubleToString(Period(),0)です。


いつからピリオドはDouble型 になったんだ?