[アーカイブ!】どんなルーキーの質問でも、フォーラムを散らかさないように。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 2. - ページ 82

 
nemo811:
ありがとうございました。フラグを立てるロジックと注文数を返す機能は理解できた。しかし、注文が終了する瞬間にも興味があります。フラグ条件が再度注文を出そうとしているように見えますが、注文番号を返す関数では1つ減っていると言って、ポジションのオープンも初期化されています。見落としがあったら訂正してください。


このコードでは、条件は一箇所(BUY=true)であり、フラグが変化するまで、再開は起こりません...ポジションを開くための関数呼び出しはこの条件ブロックから来るからです...そしてこのコードのフラグは、EAが再起動された後、値真の変数が初期化されて 初めて変化することができます。

それとも私が質問を理解していないのでしょうか :)

 
NameLess:


このコードのフラグは、Expert Advisor を再起動した後、値 true の変数が初期化されたときにのみ変更可能です。

または質問を理解していない:)


ありがとうございます、正解です。これから実施します。
 
NameLess:


これが、結果的にうまくいったバージョンです。あなたやIgorMに 感謝します。

extern bool BUY = true;
extern int Magic = 0;
extern double Lot = 0.1;
extern int takeprofit = 0;
extern int stoploss = 0;
extern int slippage = 3; 
double SL,TP;
int init(){
return(0);
}
int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy");

BUY=false;
}

return(0);
}
void OPENORDER(string ord)
{
int ticket = -1;
while (ticket<0)
{
if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0);
Sleep(500);
}
return;
}
 

string Val="";
Val = iBands(NULL,0,50,2,0,PRICE_CLOSE,MODE_LOWER,0);
string substr=StringSubstr(Val,0,1);
point_low=StrToDouble(substr);
substr=StringSubstr(Val,2,1);
point_low+=StrToDouble(substr)/10;
substr=StringSubstr(Val,3,1);
point_low+=StrToDouble(substr)/100;
substr=StringSubstr(Val,4,1);
point_low+=StrToDouble(substr)/1000;
substr=StringSubstr(Val,5,1);
point_low+=StrToDouble(substr)/10000;
substr=StringSubstr(Val,6,1);
point_low+=StrToDouble(substr)/100000;

substr=StringSubstr(Val,7,1);
point_low+=StrToDouble(substr)/1000000; //тут плюсуем 6-ю цифру после запятой.

人間、何の役にも立たない!文字列を 数値に変換したり、部分文字列を数値に変換したり、数字を抜き出したり(上の例)、馬鹿みたいに一つずつ足したり、思いつく限りのオプションを試しましたが、小数点以下4桁を超えると足さずに小数点以下4桁で丸めるようになります。小数点以下6桁まで足してもダメです(

もしかして、Alertは4つ目以降のダブル変数を表示しないのでしょうか? どうなんでしょう...何だか謎です(

 

私は2つのEAをリンクして書きました(取引はせず、ゴーバルを作成するだけです)。それらを使って、mt4の通常の価格チャートに似たエクイボリュームチャートインジケータを 作ろうと思っています。あるいは、すでに似たようなものを使っている人がいたら、そのコードを教えてください:)

ファイル:
eqvol.rar  3 kb
 
NameLess:

もしかして、Alertは4桁目以降のダブル変数を表示しないのでしょうか? どうなんでしょう...何か不思議です(

はい、1つだけ出力する場合は、(Printと 同様に)標準の4桁で表示されます。

より正確にはDoubleToStrを使用してください。

 

Rrrrrrrrrrrrrrrrrrrrrrrr... そう、Alertの ターミナルは4文字以上表示されない。ダブルをラインに戻し、取り出して画面を見ると、すべて正しく表示されている。

このくだらないことのために半日を費やした。

 
NameLess:

人間、何の役にも立たない!文字列を数値に変換したり、部分文字列を数値に変換したり、数字を抜き出したり(上の例)、馬鹿みたいに一つずつ足したり、思いつく限りのオプションを試しましたが、小数点以下4桁を超えると足さずに小数点以下4桁で丸めるようになります。小数点以下6桁まで足してもダメです(

もしかして、Alertは変数doubleの4番目の符号から先が表示されないのでしょうか? (文字列は全部表示されます)すでにどう考えてもわかりません。

まあ、いつものことですが、すべては実験にかかっているのです。脚本を書くのは私たちです。

#property copyright ""
#property link      ""
#include <Basic_dll.mqh>

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
  string Stroka,Podstroka,SMB;
        int DGS,BezDrobi;
        double Rezult;
        SMB=Symbol();
        //DGS=MarketInfo(SMB,MODE_DIGITS);
        DGS=5;// дигитс задаём принудительно, чтоб можно было проверить на любой валюте
        // передаём левое значение в переменную
        Rezult=1.252546987;
        // возводим число в степень
        for(int i=1;i<=DGS;i++){
                Rezult=Rezult*10;
        }
        // В степень возвели. Теперь отбрасываем дробную часть.
        BezDrobi=OtbrosDrobnChasti(Rezult);// функция отбрасывает дробную часть числа
        Alert("BezDrobi = ",BezDrobi);
        // теперь ставим на место запятую
        Rezult=BezDrobi*1.0;
        for(i=1;i<=DGS;i++){
                Rezult=Rezult/10;
                Alert("Rezult = ",Rezult);
        }
        Alert("----------- ",SMB," -----------");
        return(0);
}

見ての通り、スクリプトにはdll-cardが接続されています。数値の端数部分を切り取る機能を1つだけ持っています。dllファイルはこの投稿に添付されています。次に、このスクリプトを2つの通貨ペアに順次適用してみましょう。ポンドとユーロジャパンにかけました。ポンドでは、小数点以下が4桁になっていますね。ユーロ・日本の通貨ペアについて - 2.以下は、スクリプト操作の結果です。

ポンドでは、コンマの動きが一定であることがわかる。そして、最後の除算で分数部分に4桁が残っていることもわかります。my Digits = 4なので、小数点以下5桁目が切り捨てられるという仮定が成り立つ。だから、ユーロ日本も小数点以下の桁数=2なので、結果的に2桁だけになるはずです。しかし、実験では、これも小数点以下が4桁になることがわかった。そのため、我々の仮定は正しくなく、四捨五入が行われている可能性があります。最後の4を7に置き換えてみよう。その結果

何が見えるのか?その結果、5が6になった。その結果、自動丸めが行われる。

5桁の文字でスクリプトがどのように動作するかはわかりませんが、4桁と2桁の文字では、端末が干渉して、頼まれてもいないのに四捨五入してしまうなど、満足のいく動作は得られませんでした。だから、開発者に質問しなければならないのです。または、オプション 2 - インジケーターの読み取り値を文字列にして、文字列を dll に送信し、そこで必要なデータを処理して、dll から取引注文を 返します。

ファイル:
experts.rar  42 kb
 

ヘルプからの情報(アラートによる)。

Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью используйте функцию DoubleToStr().

なぜ開発者がこんなことをしたのか、考えてきてください...。

 
drknn:


ありがとうございます、コードを勉強しました、とても興味深いです。ターミナルがウィンドウの4桁目以降を表示しないだけなのです。)

zyです。改めて、すべての問題は論理的に解決されると確信しました。ここでは、もともと非論理的な状況だったので、間違った場所にヒッチを探しました :)