//+------------------------------------------------------------------+//| TestCopy.mq4 |//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |//| https://login.mql5.com/ru/users/artmedia70 |//+------------------------------------------------------------------+#property copyright"Copyright 2016, Artem A. Trishkin, Skype artmedia70"#property link"https://login.mql5.com/ru/users/artmedia70"#property version"1.00"#property strict#property script_show_inputsenum enumYN
{
enYes=1, // Да
enNo=0, // Нет
};
//--- input parametersinputint StartCopy=1; // Номер бара, с которого начинаем копироватьint startCopy=(StartCopy<0)?0:StartCopy;
inputint Search_Period=10; // Количество копируемых свечейint searchPeriod=(Search_Period<1)?1:Search_Period;
inputint Delta=2; // Количество пунктов допускаint delta=(Delta<0)?0:Delta;
input enumYN AsSeries=enYes; // Массив array как таймсерияMqlRates array[]; // Массив структур для копирования Open, High, Low, Close, Timestruct DataCandle // Структура для хранения всех совпадений
{
int number_matched; // Количество совпаденийMqlRates reference_candle; // Данные эталонной свечиMqlRates matched_candles[]; // Массив свечей, совпадающих с эталонной по нужному критерию
};
DataCandle dataCandle[]; // Массив структур данных свечей и их совпадений//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---int copy_bars=(int)fmin(searchPeriod,Bars(Symbol(),Period())); // количество копируемых свечейint searchResult=GetDataCandles(Symbol(),PERIOD_CURRENT,startCopy,copy_bars,array,dataCandle); // Вызываем функцию поиска совпадающих свечей//--- если результат есть какой-то ...if(searchResult>0) {
//--- ... посмотрим чего понаписали в массивыAlert("Array is series: ",ArrayIsSeries(array),
"\ntime array[0]: ",TimeToString(array[0].time,TIME_DATE|TIME_MINUTES),
"\ntime array[",string(searchPeriod-1),"]: ",TimeToString(array[ArraySize(array)-1].time,TIME_DATE|TIME_MINUTES));
for(int i=0; i<ArraySize(dataCandle)-1; i++) {
string refs_txt="";
string matched_txt="";
refs_txt="Свеча "+IntegerToString(i,2,'0')+": время "+TimeToString(dataCandle[i].reference_candle.time)+", high: "+DoubleToString(dataCandle[i].reference_candle.high,Digits())+" имеет совпадений: "+(string)dataCandle[i].number_matched+" шт. ";
if(dataCandle[i].number_matched>0) {
for(int j=0; j<ArraySize(dataCandle[i].matched_candles); j++) {
matched_txt="Совпадение "+IntegerToString(j+1)+": "+TimeToString(dataCandle[i].matched_candles[j].time)+", high: "+DoubleToString(dataCandle[i].matched_candles[j].high,Digits());
}
}
Print(refs_txt,matched_txt);
}
}
}
//+------------------------------------------------------------------+int GetDataCandles(string sy, ENUM_TIMEFRAMES timeframe, int begin_copy, int number_copy, MqlRates &array_rates[], DataCandle &data_candle[]) {
int copied=0;
copied=CopyRates(sy,timeframe,begin_copy,number_copy,array_rates); // копируем данныеif(copied>0) { // если скопировалиArraySetAsSeries(array_rates,AsSeries); // Задаём массив как таймсерию или нетArrayResize(data_candle,copied); // задаём размер структуры равным числу скопированных данныхZeroMemory(data_candle); // Обнуляем данные в структуре//--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. циклеfor(int i=0; i<copied-1; i++) { // цикл по скопированным данным от начала до "на один меньше размера массива"
data_candle[i].reference_candle.high=array_rates[i].high; // ищем этот high
data_candle[i].reference_candle.low=array_rates[i].low; // запомнили low для сравнения
data_candle[i].reference_candle.time=array_rates[i].time; // запомнили time для вывода в журнал//--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла iint size=0; // размер массива совпадающих свечейArrayResize(data_candle[i].matched_candles,size); // Размер массива совпадений в ноль
data_candle[i].number_matched=size; // Инициализируем количество совпадений нулём//--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом ifor(int j=0; j<copied; j++) { // в цикле от i+1 до copy_barsif(j==i) continue; // пропустим свечу "саму себя"//--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину Point)if(NormalizeDouble(delta*Point()-fabs(array_rates[i].high-array_rates[j].high),Digits())>=0) {
size++;
ArrayResize(data_candle[i].matched_candles,size); // увеличим размер массива совпадающих свечей
data_candle[i].number_matched=size; // запишем количество совпадений
data_candle[i].matched_candles[size-1].high=array_rates[j].high; // запишем в массив high совпадающей свечи
data_candle[i].matched_candles[size-1].low=array_rates[j].low; // запишем в массив low совпадающей свечи
data_candle[i].matched_candles[size-1].time=array_rates[j].time; // запишем в массив время совпадающей свечи
}
}
}
}
return(copied);
}
//+------------------------------------------------------------------+
携帯のままですが、Alertのコードとprintのループのどこに、すでに構造が記入されているのでしょう。
On Start () 関数のループのすぐ外側にアラートが 表示される
On Start () 関数のループのすぐ外側にアラートが表示される
On Start () 関数のループのすぐ外側にアラートが表示される
ここでは、それを関数にする方法をおおまかに紹介します。そして、必要なときにいつでも呼び出すことができる。
できます。
驚くべき可能性。
ありがとうございました。
どこで詳しく読めるか教えてください。
今、urlにテキストを公開しようとしているのですが、ヘルプで示されたコードは自分のホームサイトでも認証しようとしません。
テキストを承認して公開するために、第三者のサイトについて、URLアドレス以外にどのような情報を収集する必要があるのだろうかと思います。
どこで詳しく読めるか教えてください。
こちら
ごあいさつ
詳しいみんな、どうやって問題を解決したらいいのかわからないよ。
M T4で利用できるパネル作成クラスやダイアログを 利用して、MT4で自分用のトレーディングパネルを作成して います。
取引の開始 価格にデータを入力したり、SLやTPを設定するために、私はCEDIT クラス (「Input field 」オブジェクトをベースにした簡易コントロールのクラスです)を使っています。代替案 として、CSpinEdit クラス(Increment-Decrementフィールドを組み合わせたコントロールのクラスです)がありますが、これは整数データに対して使用 されます。一般的には 、インクリメントを必要としないので、 CEditを 使う 方が快適です。
では、 CEDITの 入力フィールドに 数字だけを入力できるようにするにはどうしたらよいのでしょうか 。MT4ターミナルで「新規注文」を押すと、ストップロスや テイクプロフィットの 欄が0.0000などとマスクされるのは、エントリーをマスクした方が良いのでしょう。CEditで同じことをするには ?ただ、授業のテーマがあまり深くなく、不明な点もある。
ごあいさつ
アドバイスの対象になっている人たちは、問題を解決する方法がわからないんだ。
MT4で 利用できるパネル作成クラスとダイアログを使って 、MT4で自分用のトレーディングパネルを書いて います。
CEdit クラス (Entry fieldオブジェクトをベースにした簡易コントロールのクラス です)を使用しています。代替案 として、CSpinEditクラス (Increment-Decrementフィールドを組み合わせたコントロールのクラスです)がありますが、これは整数データに対して使用されます。一般的には 、インクリメントを必要としないので、 CEditを 使う 方が快適です。
では、 CEDITの 入力フィールドに 数字だけを入力できるようにするにはどうしたらよいのでしょうか 。MT4ターミナルで「新規注文」を押すと、ストップロスやテイクプロフィットの欄が0.0000などとマスクされるのは、エントリーをマスクした方が良いのでしょう。 CEditで同じことをするには ?ただ、授業のテーマがあまり深くなく、不明な点もある。
CEditコントロールによるダイアログパネルです(わかりやすいように、この例は1つのファイルとして作られています) - パネルは入力された文字をチェックします。数字のみ使用可能です。
こちら
本書は非売品ですが、自由に入手することができます。
ありがとうございます。