
文字列:ASCII シンボルのテーブルとその使用
はじめに
本稿では、ASCII シンボルのテーブルとその利用方法を分析します。また、その動作原理が ASCII テーブルの特殊性に基づく新しい関数をいくつか取り上げ、それらをインクルードする新しいライブラリを作成します。それらは別のプログラム言語ではきわめて一般的ですが、埋め込み関数には含まれていないものです。そのほかに、文字列を処理する基本を詳しく考察します。よって、みなさんはこの便利なデータタイプについて、確かに何か新しいことを学ぶこととなるのです。
ASCII とは何でしょうか?
ASCII とは情報相互交換のためのアメリカのコーディング規格(American Standard Code for Information Interchange)を言います。この規格は英語のアルファベットに基づいています。ASCII コードはコンピュータのテキスト、通信機器、その他テキストを処理するデバイスを提供するものです。ASCII は1963年に作成されましたが、規格として最初に公表されたのは1967年です。直近の改訂は1986年に行われました。ASCII について詳しくは以下にあります。https://en.wikipedia.org/wiki/ASCII のちに、MQL4 オプションを使用して ASCII を表示する方法を検討しますが、まずは文字列処理の基本を考察します。
ライブラリを書く原則
この類のライブラリを描くにあたり、基本的な重点をいくつか理解します。まずデータ配列のようなシンボルすべてを調べる方法を確認します。似ているコードパーツはつねに関数で反復し、シンボル単位の処理を行います。例として、簡単なスクリプトを書きます。それはまず一般的な文字列を、それから処理済みの1つを表示します。ここで各シンボルはスペースによって区切られます。
//+------------------------------------------------------------------+ //| StringExpereriment1.mq4 | //| Copyright © 2007, Antonio Banderass. All rights reserved | //| banderassa@ukr.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, Antonio Banderass. All rights reserved" #property link "banderassa@ukr.net" //+------------------------------------------------------------------+ //| start | //+------------------------------------------------------------------+ int start() { string s1 = "Just_a_string", s2, symbol = "s"; int lenght = StringLen(s1); MessageBox(s1); for(int x = 0; x < lenght; x++) { symbol = StringSetChar(symbol, 0, StringGetChar(s1, x)); s2 = s2 + symbol + " "; } MessageBox(s2); return(0); } //+------------------------------------------------------------------+
各文字列の値を分析します。<
string s1 = "Just_a_string", s2, symbol = "s";
文字列タイプの変数を3つ決めます。
- s1 -1番目の文字列で、処理対象です。
- s2 -結果を持つ文字列です。
- シンボル-各シンボルを一時的に格納するのに使用される文字列です。
それはシンボル1つで初期化されることに注意します。これを行わなければ、結果として第1のシンボルを持たない文字列を取得してしまいます。問題は標準的MQL4 の関数 StringGetChar() はすでに作成済みのシンボルを変更し、そのため通常動作に最低シンボルが1つ必要となることです。 <
int lenght = StringLen(s1);
MessageBox(s1);
for(int x = 0; x < lenght; x++)
symbol = StringSetChar(symbol, 0, StringGetChar(s1, x));
この文字列では、標準関数が2つ使用されます。それらは StringSetChar() と StringGetChar() です。前者は文字列のシンボルの一つを置き換え、後者は指定の位置にシンボルコードを取得します。関数 StringSetChar() は、以下のようにパラメータを3つ持ちます。
- 「ストリング」ではシンボルが置換されます。
- 「シンボルの位置」は置換されます(文字列は配列のようにゼロからインデックスが付けられることを思い出します)。
- 「シンボルのコード」は置き換えを行います。
この関数は変更された文字列の形で結果を返します。もう一つ重要な関数があります。それは StringGetChar です。パラメータは2つ持ちます。
- 「シンボルを持つストリング」-これのコードが認識されます。
- 「シンボルの位置」-これのコードが認識されます。
この関数はシンボルコードを返します。関数 StringGetChar がシンボルコードを返すので、私はその呼び出しを関数 StringSetChar のパラエータの位置に入れました。よって、この関数を使用するときは、のちの処理のために現在のシンボルを覚えておきます。サイクル実行中は、文字列 s1 の各シンボルは変数に割り当てられます。
s2 = s2 + symbol + " ";
加法演算(+)によって文字列は簡単にバインド(コンカチネーション)できます。ここで各サイクルの反復において、結果の文字列にシンボルとスペースを追加します。 MessageBox(s2);
結果を表示します。逆を行うのも可能ですが、1番目のシンボルから始めて各シンボルを読むことに注意します。この場合、より短いコード、少ない変数を取得します。文字列処理でどちらの側から始めるかが問題でなければ、以下のバリアントを使用します。//+------------------------------------------------------------------+ //| StringExperiment2.mq4 | //| Copyright © 2007, Antonio Banderass. All rights reserved | //| banderassa@ukr.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, Antonio Banderass. All rights reserved" #property link "banderassa@ukr.net" //+------------------------------------------------------------------+ //| start | //+------------------------------------------------------------------+ int start() { string s1 = "Just_a_string", s2, symbol = "s"; int lenght = StringLen(s1) - 1; MessageBox(s1); while(lenght >= 0) { symbol = StringSetChar(symbol, 0, StringGetChar(s1, lenght)); s2 = s2 + symbol + " "; lenght--; } MessageBox(s2); return(0); } //+------------------------------------------------------------------+
サイクル 'for' の代わりに 'while' を使用します。それによりカウンター x を諸略することが可能となるのが、おわかりでしょう。このために、変数 length を使用します。のちに、関数を描くために2つのテンプレートの1つを使用します。それは処理シーケンスが重要か否かで決まります。われわれの場合、逆順でシンボルを持つ文字列を取得します。すなわち、ここでは処理シーケンスはひじょうに重要であるということです。
シンボル ASCII をすべて表示します。
ここですべての ASCII シンボルを表示してみます。コード上で ASCII のシンボルを指定の位置に適切に挿入し、シンボルのコードを返す関数 StringSetChar() と StringGetChar() を思い出します。StringSetChar() には第3のパラメータ、int 値があります。これはASCII シンボルテーブルに入っているコードです。各シンボルのコードを決定する特別なスクリプトを書きます。//+------------------------------------------------------------------+ //| StringExperiment3.mq4 | //| Copyright © 2007, Antonio Banderass. All rights reserved | //| banderassa@ukr.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, Antonio Banderass. All rights reserved" #property link "banderassa@ukr.net" //+------------------------------------------------------------------+ //| start | //+------------------------------------------------------------------+ int start() { string s, symbol = "s"; for(int x = 0; x < 256; x++) { symbol = StringSetChar(symbol, 0, x); s = s + x + " = " + symbol + " \t"; if(x % 10 == 0) s = s + " \n"; } MessageBox(s); return(0); } //+------------------------------------------------------------------+
スクリプトは MQL4 の内容関数と新規文字列の文字列定数およびテーブル可視化のための作表機能を使用します。そしてコンパイルし、それを起動します。ASCII シンボルのテーブルが表示されます。
よく注意してそれを見てください。数字や文字から特殊記号に至るまで全シンボルが完全に表示されています。一部は見たことがないものかもしれません。まずコードがきて、記号 "=" のあとにシンボル自体がきます。いくつか重要なシンボルセットに印を付けました。
文字の整列に注意を払います。文字はアルファベット順に整列されています。この特徴はのちに一部の関数を書くのに使用します。たとえば文字を大文字の文字列から小文字に変換する場合やその逆の場合です。
そしてここで、新しい関数を取り上げ、最後にそれらを基にしたライブラリを作成します。
StringUpperCase と StringLowerCase
これらは文字列を大文字または小文字に変換するのに使用される、ひじょうに一般的な関数です。その実装は、大文字シンボルが小文字の文字から 32 移動するということが基本になっています。それはテーブルからわかります。実際には、たとえば以下のコードでシンボル 'A'、Z'、a'、'z'のコードを検索する場合、
string s = "AZaz"; MessageBox("A = " + StringGetChar(s, 0)); MessageBox("Z = " + StringGetChar(s, 1)); MessageBox("a = " + StringGetChar(s, 2)); MessageBox("z = " + StringGetChar(s, 3));
結果は、それぞれ次のようなものです。A= 65、Z= 90、a= 97、z= 122よって、この特性を考慮する必要があります。この関数のソースコードを見ます。
//+------------------------------------------------------------------+ //| StringUpperCase | //+------------------------------------------------------------------+ string StringUpperCase(string str) { string s = str; int lenght = StringLen(str) - 1, symbol; while(lenght >= 0) { symbol = StringGetChar(s, lenght); if((symbol > 96 && symbol < 123) || (symbol > 223 && symbol < 256)) s = StringSetChar(s, lenght, symbol - 32); else if(symbol > -33 && symbol < 0) s = StringSetChar(s, lenght, symbol + 224); lenght--; } return(s); } //+------------------------------------------------------------------+ //| StringLowerCase | //+------------------------------------------------------------------+ string StringLowerCase(string str) { string s = str; int lenght = StringLen(str) - 1, symbol; while(lenght >= 0) { symbol = StringGetChar(s, lenght); if((symbol > 64 && symbol < 91) || (symbol > 191 && symbol < 224)) s = StringSetChar(s, lenght, symbol + 32); else if(symbol > -65 && symbol < -32) s = StringSetChar(s, lenght, symbol + 288); lenght--; } return(s); }処理のシーケンスは重要ではありませんが、サイクル while を使用しています。この関数の使用は非常に簡単です。唯一のパラメータは string で、それは大文字小文字を適切に変換します。
string s1 = "UPPER_REGISTER_STRING"; string s2 = "lower_register_string"; MessageBox(StringLowerCase(s1)); // upper_register_string MessageBox(StringUpperCase(s2)); // LOWER_REGISTER_STRING
StringCompare
MQL4 では、文字列の比較は "==" によって演算子レベルで行われます。興味をひかれるのが、比較は大文字小文字を区別することです。すなわち、 "STRING" と "string" は別のものです。
if("STRING" == "string") // FALSE MessageBox("TRUE"); else MessageBox("FALSE");
大文字小文字を無視せず2つの文字列を比較する必要がある場合、関数 StringCompare() を使用します。それは比較の演算子のようにboolタイプの変数を返します。実装は簡単です。前に小文字に変換された文字列を比較しています。
//+------------------------------------------------------------------+ //| StringCompare | //+------------------------------------------------------------------+ bool StringCompare(string s1, string s2) { return(StringLowerCase(s1) == StringLowerCase(s2)); }
使用例:
if(StringCompare("STRING", "string")) // TRUE MessageBox("TRUE"); else MessageBox("FALSE");
StringIsDigit
この関数は文字列の内容をチェックします。文字列が番号だけであれば 真を、それ以外は偽を返します。実装はひじょうに簡単で、数値シンボルは1行にあり、48~58 のコードを持つことを基本にしています。
//+------------------------------------------------------------------+ //| StringIsDigit | //+------------------------------------------------------------------+ bool StringIsDigit(string str) { bool result = true; string s = str; int lenght = StringLen(str) - 1, symbol; while(lenght > 0) { symbol = StringGetChar(s, lenght); if(!(symbol > 47 && symbol < 58)) { result = false; break; } lenght--; } return(result); }
使用例:
if(StringIsDigit("1234567890")) // TRUE MessageBox("TRUE"); else MessageBox("FALSE"); if(StringIsDigit("1234notdigit")) // FALSE MessageBox("TRUE"); else MessageBox("FALSE");
StringIsAlpha
この関数は、前出のもの同様、文字列が文字だけを持つか判断します。実装は類似しています。
//+------------------------------------------------------------------+ //| StringIsAlpha | //+------------------------------------------------------------------+ bool StringIsAlpha(string str) { bool result = false; string s = str; int lenght = StringLen(str) - 1, symbol; while(lenght > 0) { symbol = StringGetChar(s, lenght); if((symbol > 96 && symbol < 123) || (symbol > 64 && symbol < 91) || (symbol > 191 && symbol < 256) || (symbol > -65 && symbol < 0)) { result = true; break; } lenght--; } return(result); }
使用例:
if(StringIsAlpha("thereAreSomeLetters")) // TRUE MessageBox("TRUE"); else MessageBox("FALSE"); if(StringIsAlpha("thereAreSomeDigits12345")) // FALSE MessageBox("TRUE"); else MessageBox("FALSE");
ライブラリの作成
関数をすべて1つのライブラリに集めます。それには MetaEditor 4 で「ファイル → 新規 → ライブラリ → 次へ」をクリックします。フィールド名に stringProcess と書き、OK をクリックします。それから上で述べた関数のコードを挿入し保存します。そして、「ファイル → 新規 → インクルード(*. MQH) → OK」をクリックし関数プロトタイプでファイルを作成します。フィールド名に stringProcess と書き、→ OK します。ここで、新規関数すべてのプロトタイプを挿入し、インポートする命令を指示します。
//+------------------------------------------------------------------+ //| stringProcess.mqh | //| Antonio Banderass Copyright © 2007 | //| banderassa@ukr.net | //+------------------------------------------------------------------+ #property copyright "Antonio Banderass Copyright © 2007" #property link "banderassa@ukr.net" //+--- #import "stringProcess.ex4" //+------------------------------------------------------------------+ //| prototypes | //+------------------------------------------------------------------+ string StringUpperCase(string str); string StringLowerCase(string str); bool StringCompare(string s1, string s2); bool StringIsDigit(string str); bool StringIsAlpha(string str);
ライブラリ stringProcess の使用
ライブラリを使用するには、関数プロトタイプを持つヘッダファイルをインクルードし、その後必要な関数を呼び出します。以下はスクリプト内での使用例です。
//+------------------------------------------------------------------+ //| stringProcessLibraryTest.mq4 | //| Antonio Banderass Copyright © 2007 | //| banderassa@ukr.net | //+------------------------------------------------------------------+ #property copyright "Antonio Banderass Copyright © 2007" #property link "banderassa@ukr.net" #include <stringProcess.mqh> //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { if(StringIsDigit("1234567890")) // TRUE MessageBox("TRUE"); else MessageBox("FALSE"); if(StringIsDigit("1234notdigit")) // FALSE MessageBox("TRUE"); else MessageBox("FALSE"); return(0); }
おわりに
シンボルのテーブルについて、また新しいい関数を考案するのにその構造特性を利用する方法を学習してきました。別のプログラム言語ではひじょうに一般的でありながら MQ4L にはインクルードされていない、新しい関数を書きました。そして、それらを基に処理を格納するための小規模なライブラリを作成しました。私は、このライブラリは取引中ではなく、結果受信の際に使用されるものだと思います。たとえば、ご自分の Expert Advisor に対するレポートの独自システムを作成しようとしているなら、関数の一部は役に立つことでしょう。それ以外に、私の知らない、みなさんが利用される領域を数多くみつけられることでしょう。グッドラック!そして利益を!
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/1474


- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索