CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

一目均衡表を指標・サインに用いたEA

2024-08-07 21:30:57 | FX

EAで一目均衡表を使う(サンプルソース)  –  ぷろぐらむFX

EAで一目均衡表を使う(サンプルソース) – ぷろぐらむFX



このサイトは一目均衡表を使ったEAのソースコードを掲載してくれている。

一目均衡表は複雑怪奇にして難解だ。
だからこそしっかり仕組みを理解して使いこなそうではないか!

一目均衡表を使ったEAの存在を初めて知った。一目均衡表はレンジに弱いらしい。

だからフーリエ変換でトレンド発生のきっかけとなる波を検知し、一目均衡表のシグナルと照らし合わせて逆指値トラップを張るようにすればよい。

そしてレンジ発生の兆候を検知したら利確・損切りして撤収し、次のトレンドを待てば良い。

その他の情報はGoogleで
「一目均衡表 自動売買」
で検索すべし!

MQL4でPythonを呼び出す方法

2023-05-13 12:23:31 | FX

MQL4でPythonを呼び出す方法

MQL4 から Python を呼び出す方法はいくつかあります。1 つの方法は、Python プログラムをコンパイルして DLL ファイルにしてから、MQL4 から DLL ファイルをロードすることです。もう 1 つの方法は、Python スクリプトを実行するサーバーを使用して、MQL4 から Python スクリプトを呼び出すことです。

DLL ファイルを使用して MQL4 から Python を呼び出すには、次の手順に従います。

Python プログラムをコンパイルして DLL ファイルにします。
DLL ファイルを MQL4 のインストールディレクトリにコピーします。
MQL4 のソースファイルで、次の行を使用して DLL ファイルをロードします。


#include

HMODULE hModule = LoadLibrary("python.dll");

if (hModule == NULL) {
// エラー処理
}


DLL 内の関数を呼び出すには、次の構文を使用します。

FARPROC pFunc = GetProcAddress(hModule, "FunctionName");

if (pFunc == NULL) {
// エラー処理
}

int result = (int)pFunc();

サーバーを使用して MQL4 から Python スクリプトを呼び出すには、次の手順に従います。

Python スクリプトを実行するサーバーをセットアップします。
MQL4 のソースファイルで、次の行を使用してサーバーに接続します。


#include
#include

using namespace std;

int main() {
// サーバーに接続
string host = "localhost";
int port = 5000;

Socket socket(host, port);

if (!socket.isConnected()) {
// エラー処理
}

// Python スクリプトを実行する
string command = "python myscript.py";

socket.write(command.c_str());

// 応答を待つ
char buffer[1024];

int bytesReceived = socket.read(buffer, 1024);

if (bytesReceived == -1) {
// エラー処理
}

// 応答を出力する
cout <

// サーバーを切断する
socket.close();

return 0;
}


一目均衡表を使った逆指値自動売買EA

2023-04-09 01:24:50 | FX
一目均衡表を使った逆指値自動売買EAのコードを書いてください。
 
一目均衡表を使った逆指値自動売買EAのコードの例を以下に示します。このコードは、Pythonで書かれたもので、Backtraderと呼ばれるフレームワークを使用しています。これは、一目均衡表の計算やトレードシグナルの生成などの多くの機能を提供してくれます。
 
import backtrader as bt
import backtrader.indicators as btind
 
class IchimokuStrategy(bt.Strategy):
params = (
('tenkan_period', 9),
('kijun_period', 26),
('senkou_period', 52),
('senkou_offset', 26),
('stop_loss', 100),
('take_profit', 200),
('trade_size', 10000),
)
 
def __init__(self):
self.ichimoku = btind.Ichimoku(self.data)
self.tenkan_sen = self.ichimoku.tenkan_sen
self.kijun_sen = self.ichimoku.kijun_sen
self.senkou_span_a = self.ichimoku.senkou_span_a
self.senkou_span_b = self.ichimoku.senkou_span_b
 
def next(self):
if self.position:
if self.data.close[0] < self.senkou_span_a[0]:
self.close()
elif self.data.close[0] > self.senkou_span_b[0]:
self.close()
 
else:
if self.tenkan_sen[0] > self.kijun_sen[0] and self.data.close[0] > self.senkou_span_a[0]:
self.buy(size=self.params.trade_size, exectype=bt.Order.Stop, price=self.data.close[0] + self.params.stop_loss)
self.sell(size=self.params.trade_size, exectype=bt.Order.Limit, price=self.data.close[0] + self.params.take_profit)
 
elif self.tenkan_sen[0] < self.kijun_sen[0] and self.data.close[0] < self.senkou_span_b[0]:
self.sell(size=self.params.trade_size, exectype=bt.Order.Stop, price=self.data.close[0] - self.params.stop_loss)
self.buy(size=self.params.trade_size, exectype=bt.Order.Limit, price=self.data.close[0] - self.params.take_profit)
↑この部分が文法エラーだから直せとよ!
このコードでは、IchimokuStrategyという名前のクラスが定義されています。このクラスは、backtrader.Strategyクラスを継承しており、バックテストやトレードシグナルの生成を担当します。paramsには、トレードに必要なパラメーターが含まれています。
 
IchimokuStrategyでは、__init__メソッドで一目均衡表のインジケーターを初期化しています。また、nextメソッドで、現在のポジションと市場状況を分析し、売買の条件を決定します。
 
売買ルールは以下の通りです。
 
ポジションがなく、テンカン線が基準線を上回り、クロージング価格が先行スパンAよりも高い場合、指定されたサイズでロングポジションを取得します。同時に、ストップロス価格をクロージング価格に設定し、テイクプロフィット価格をクロージング価格に加えたものに設定された価格でリミット注文を出します。
ポジションがなく、テンカン線が基準線を下回り、クロージング価格が先行スパンBよりも低い場合、指定されたサイズでショートポジションを取得します。同時に、ストップロス価格をクロージング価格に設定し、テイクプロフィット価格をクロージング価格から差し引いたものに設定された価格でリミット注文を出します。
ポジションがある場合、クロージング価格が先行スパンAよりも低い場合、ポジションをクローズします。
ポジションがある場合、クロージング価格が先行スパンBよりも高い場合、ポジションをクローズします。
これらのルールに基づいて、IchimokuStrategyクラスがバックテストを実行し、トレードを行います。このコードは、実際の取引に使用する前に、さまざまなパラメータを調整して、最適なパフォーマンスを得る必要があります。
 
runfile('C:/Users/User/untitled0.py', wdir='C:/Users/User')
  File "C:\Users\User\untitled0.py", line 33
    elif:
    ^
SyntaxError: invalid syntax
 

import backtrader as bt
import backtrader.indicators as btind

class IchimokuStrategy(bt.Strategy):
    params = (
('tenkan_period', 9),
('kijun_period', 26),
('senkou_period', 52),
('senkou_offset', 26),
('stop_loss', 100),
('take_profit', 200),
('trade_size', 10000),
)

def __init__(self):
    self.ichimoku = btind.Ichimoku(self.data)
self.tenkan_sen = self.ichimoku.tenkan_sen
self.kijun_sen = self.ichimoku.kijun_sen
self.senkou_span_a = self.ichimoku.senkou_span_a
self.senkou_span_b = self.ichimoku.senkou_span_b

def next(self):
    if self.position:
        if self.data.close[0] < self.senkou_span_a[0]:
            self.close()
    elif self.data.close[0] > self.senkou_span_b[0]:
        self.close()

    else:
        if self.tenkan_sen[0] > self.kijun_sen[0] and self.data.close[0] > self.senkou_span_a[0]:
            self.buy(size=self.params.trade_size, exectype=bt.Order.Stop, price=self.data.close[0] + self.params.stop_loss)
            self.sell(size=self.params.trade_size, exectype=bt.Order.Limit, price=self.data.close[0] + self.params.take_profit)        
    elif:
        self.tenkan_sen[0] < self.kijun_sen[0] and self.data.close[0] < self.senkou_span_b[0]:
            self.sell(size=self.params.trade_size, exectype=bt.Order.Stop, price=self.data.close[0] - self.params.stop_loss)
            self.buy(size=self.params.trade_size, exectype=bt.Order.Limit, price=self.data.close[0] - self.params.take_profit)

↑ここの文法エラーがどうにもならん!


一目均衡表は最強!? 一目均衡表の使い方

2023-04-02 00:57:11 | FX

一目均衡表は最強!売買シグナルの見方3つと実践での使い方を紹介

一目均衡表は最強!売買シグナルの見方3つと実践での使い方を紹介

FXの一目均衡表とは?一目山人(いちもくさんじん)こと、細田悟一氏が、2千人のスタッフと、7年かけて編み出した純国産のテクニカル分析が一目均衡表(いちもくきんこうひ...

FXの教科書

一目均衡表は最強!だそうだ。


FXの任意のチャートをフーリエ変換するMQL4プログラム

2023-03-13 20:30:47 | FX

FXの任意のチャートをフーリエ変換するプログラムをMQL4で書いて。

MQL4でFXチャートをフーリエ変換するプログラムを作成するには、まずチャートから価格データを収集し、それを数値データに変換する必要があります。その後、収集した価格データをフーリエ変換するためのアルゴリズムを実装する必要があります。

以下は、MQL4でFXチャートのフーリエ変換を行うプログラムの一例です。

// チャートから価格データを収集する
double prices[];
int limit;
int counted_bars = IndicatorCounted();
if(counted_bars < 0) return(-1);
if(counted_bars > 0) counted_bars--;
limit = Bars - counted_bars;
ArraySetAsSeries(prices, true);
for(int i = 0; i < limit; i++) {
    prices[i] = Close[i];
}

// フーリエ変換を行う
Complex fft[];
ArraySetAsSeries(fft, true);
ArrayResize(fft, limit);
for(int i = 0; i < limit; i++) {
    fft[i].re = prices[i];
    fft[i].im = 0;
}
FourierTransform(fft, FFT_FORWARD);

// 結果を表示する
for(int i = 0; i < limit; i++) {
    double freq = i / (Period() * limit);
    double amplitude = MathSqrt(fft[i].re*fft[i].re + fft[i].im*fft[i].im);
    Print("Frequency: ", freq, ", Amplitude: ", amplitude);
}

このプログラムでは、Close価格を収集し、FourierTransform関数を使用してフーリエ変換を実行します。結果は、周波数と振幅のペアのリストとして表示されます。

ただし、このプログラムはFXチャートのヒストリカルデータを使用してフーリエ変換を行うだけで、リアルタイムでの解析には適していません。また、フーリエ変換を使用する場合、周期的な信号に対してのみ有効であるため、FXチャートの場合には限界があります。


レンジブレイクアウト逆指値トラップリピートEA

2023-03-13 20:27:24 | FX

ボックスブレイクアウトを狙うためのMT4インジケーター集

ボックスブレイクアウトを狙うためのMT4インジケーター集

今回はボックスブレイクアウトを狙う際に便利なインジケーターをご紹介します。 ボックスブレイクアウトは別名「タイムレンジブレイク」とも呼ばれ、特定の時間帯の値幅をブ...

元FXコーチによるFX情報商材検証ブログ

レンジをボックスで囲み、ボックスを突破した所をトレンド発生と判断し、逆指値トラップをはる手法。

ダマシがあるので、突破したらすぐ逆指値を入れるのではなく、任意の間隔を開けてから逆指値を入れるようにするといいらしい。

自動でボックスを作り、突破して指定のpipes離れたら逆指値を自動で入れるEAを開発すべきだ。


にあるようなフーリエ変換インジケータを併用すると、さらに効果的と思われる。

レンジ判定にはpythonによるディープラーニングプログラムの適用が望ましい。

ex.4ファイルをGhidraで逆コンパイルできますか?

2023-03-13 17:49:54 | FX
ChatGPTで超ヤバい質問をしてみた。

MT4のex.4ファイルをGhidraで逆コンパイルすることはできますか?

Ghidraは多くのバイナリ形式に対応していますが、MT4のex.4ファイルがどのような形式であるかによっては、Ghidraで逆コンパイルできるかどうかが異なります。

一般的に、Ghidraはプログラムのバイナリを解析し、アセンブリ言語に変換することができますが、そのバイナリ形式がサポートされている必要があります。MT4のex.4ファイルがGhidraで逆コンパイルできるかどうかは、ファイルがどのような形式であるかによって異なります。

MT4のex.4ファイルが、Ghidraがサポートしているバイナリ形式の1つであるx86アーキテクチャでコンパイルされている場合、Ghidraはそれを逆コンパイルすることができます。ただし、MT4のex.4ファイルが別のアーキテクチャでコンパイルされている場合、Ghidraは逆コンパイルできません。

したがって、MT4のex.4ファイルをGhidraで逆コンパイルできるかどうかを確認するには、ファイルのバイナリ形式が何であるかを特定する必要があります。ファイルのバイナリ形式がx86アーキテクチャである場合は、Ghidraを使用して逆コンパイルすることができます。そうでない場合は、他のツールを使用する必要があるかもしれません。

Spectrometr separateのソースコード

2023-03-07 20:46:36 | FX

#property copyright ""
#property link ""

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 Red
#property indicator_color2 Orange
#property indicator_color3 Yellow
#property indicator_color4 Lime
#property indicator_color5 Blue
#property indicator_color6 DodgerBlue
#property indicator_color7 DarkViolet
#property indicator_color8 DimGray

//---- input parameters

extern int iPeriod=240;
extern int iStartFrom=1;
extern string AddToObjName="1";
extern color HandlerColor=Gray;
extern color TextColor=Black;

string ObjNPref="Spectrometr";
string ShortName;

int LastTime;
double A[],B[],R[],F[];

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];


int LastLeftBar;
int LastRightBar;
int LastLeftTime;
int LastRightTime;
int LastStartFrom;
int LastiStartFrom;
int LastiPeriod;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init(){
ShortName=ObjNPref+"_"+AddToObjName;
ObjNPref=ObjNPref+"_"+AddToObjName+"_";



IndicatorShortName(ShortName);

SetIndexStyle(0,DRAW_LINE,DRAW_LINE,2);
SetIndexBuffer(0,ExtMapBuffer1);

SetIndexStyle(1,DRAW_LINE,DRAW_LINE,2);
SetIndexBuffer(1,ExtMapBuffer2);

SetIndexStyle(2,DRAW_LINE,DRAW_LINE,2);
SetIndexBuffer(2,ExtMapBuffer3);

SetIndexStyle(3,DRAW_LINE,DRAW_LINE,2);
SetIndexBuffer(3,ExtMapBuffer4);

SetIndexStyle(4,DRAW_LINE,DRAW_LINE,2);
SetIndexBuffer(4,ExtMapBuffer5);

SetIndexStyle(5,DRAW_LINE,DRAW_LINE,2);
SetIndexBuffer(5,ExtMapBuffer6);

SetIndexStyle(6,DRAW_LINE,DRAW_LINE,2);
SetIndexBuffer(6,ExtMapBuffer7);

SetIndexStyle(7,DRAW_LINE,DRAW_LINE,2);
SetIndexBuffer(7,ExtMapBuffer8);

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
fObjDeleteByPrefix(ObjNPref);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+

int start(){


string ObjName=ObjNPref+"ヘ裘・ ・湜";

if(ObjectFind(ObjName)!=WindowFind(ShortName)){
LastStartFrom=iStartFrom;//
LastLeftBar=iStartFrom+iPeriod-1;
LastRightBar=iStartFrom;
LastLeftTime=Time[LastLeftBar];
LastRightTime=Time[LastRightBar];
fObjTrendLine(ObjName,LastLeftTime,0,LastRightTime,0,false,HandlerColor,3,WindowFind(ShortName),0,true);
}

int NowLeftTime=ObjectGet(ObjName,OBJPROP_TIME1);
int NowRightTime=ObjectGet(ObjName,OBJPROP_TIME2);
if(NowRightTime>Time[1])NowRightTime=Time[1];

int NowLeftBar=iBarShift(NULL,0,NowLeftTime,false);
int NowRightBar=iBarShift(NULL,0,NowRightTime,false);
iPeriod=NowLeftBar-NowRightBar+1;
int LastStartFromTime=iBarShift(NULL,0,LastRightTime,false);
iStartFrom=(NowRightBar-LastStartFromTime)+LastStartFrom;

LastStartFrom=iStartFrom;
LastLeftBar=iStartFrom+iPeriod-1;
LastRightBar=iStartFrom;
LastLeftTime=Time[LastLeftBar];
LastRightTime=Time[LastRightBar];
fObjTrendLine(ObjName,LastLeftTime,0,LastRightTime,0,false,HandlerColor,3,WindowFind(ShortName),0,true);

ObjName=ObjNPref+"iPeriod";
fObjLabel(ObjName,80,5,"Period: "+iPeriod,3,TextColor,8,WindowFind(ShortName),"Arial Black",false);
ObjName=ObjNPref+"iStartFrom";
fObjLabel(ObjName,10,5,"StartFrom: "+iStartFrom,3,TextColor,8,WindowFind(ShortName),"Arial Black",false);


//=====================================================================================================

static int LastBars=0;

if(iStartFrom==LastiStartFrom && iPeriod==LastiPeriod)if(Bars
LastiStartFrom=iStartFrom;
LastiPeriod=iPeriod;
LastBars=Bars;

ArrayInitialize(ExtMapBuffer1,EMPTY_VALUE);
ArrayInitialize(ExtMapBuffer2,EMPTY_VALUE);
ArrayInitialize(ExtMapBuffer3,EMPTY_VALUE);
ArrayInitialize(ExtMapBuffer4,EMPTY_VALUE);
ArrayInitialize(ExtMapBuffer5,EMPTY_VALUE);
ArrayInitialize(ExtMapBuffer6,EMPTY_VALUE);
ArrayInitialize(ExtMapBuffer7,EMPTY_VALUE);
ArrayInitialize(ExtMapBuffer8,EMPTY_VALUE);

//=====================================================================================================

int tPeriod;
double tVal_0;
double tVal_1;
double tB;
double tMaxDev;
double tStdError;
double tRSquared;
double Arr[];

fLinearRegressionAll2(iStartFrom,iStartFrom+iPeriod-1,0,tPeriod,tVal_0,tVal_1,tB,tMaxDev,tStdError,tRSquared,Arr);

//======================================================================================================

fFurie(Arr,A,B,R,F);
//======================================================================================================

int N=ArraySize(Arr);
for(int i=0;i
int ii=i+iStartFrom;
ExtMapBuffer1[ii]=A[1]*MathSin(1*6.28*i/(N-1))+B[1]*MathCos(1*6.28*i/(N-1));
ExtMapBuffer2[ii]=A[2]*MathSin(2*6.28*i/(N-1))+B[2]*MathCos(2*6.28*i/(N-1));
ExtMapBuffer3[ii]=A[3]*MathSin(3*6.28*i/(N-1))+B[3]*MathCos(3*6.28*i/(N-1));
ExtMapBuffer4[ii]=A[4]*MathSin(4*6.28*i/(N-1))+B[4]*MathCos(4*6.28*i/(N-1));
ExtMapBuffer5[ii]=A[5]*MathSin(5*6.28*i/(N-1))+B[5]*MathCos(5*6.28*i/(N-1));
ExtMapBuffer6[ii]=A[6]*MathSin(6*6.28*i/(N-1))+B[6]*MathCos(6*6.28*i/(N-1));
ExtMapBuffer7[ii]=A[7]*MathSin(7*6.28*i/(N-1))+B[7]*MathCos(7*6.28*i/(N-1));
ExtMapBuffer8[ii]=A[8]*MathSin(8*6.28*i/(N-1))+B[8]*MathCos(8*6.28*i/(N-1));
}

//======================================================================================================
//・湜・籵
fObjTrendLine(ObjNPref+"1",Time[0]+Period()*60*3,R[1],Time[0]+Period()*60*3,-R[1],false,indicator_color1,8,WindowFind(ShortName),0,false);
fObjTrendLine(ObjNPref+"2",Time[0]+Period()*60*5,R[2],Time[0]+Period()*60*5,-R[2],false,indicator_color2,8,WindowFind(ShortName),0,false);
fObjTrendLine(ObjNPref+"3",Time[0]+Period()*60*7,R[3],Time[0]+Period()*60*7,-R[3],false,indicator_color3,8,WindowFind(ShortName),0,false);
fObjTrendLine(ObjNPref+"4",Time[0]+Period()*60*9,R[4],Time[0]+Period()*60*9,-R[4],false,indicator_color4,8,WindowFind(ShortName),0,false);
fObjTrendLine(ObjNPref+"5",Time[0]+Period()*60*11,R[5],Time[0]+Period()*60*11,-R[5],false,indicator_color5,8,WindowFind(ShortName),0,false);
fObjTrendLine(ObjNPref+"6",Time[0]+Period()*60*13,R[6],Time[0]+Period()*60*13,-R[6],false,indicator_color6,8,WindowFind(ShortName),0,false);
fObjTrendLine(ObjNPref+"7",Time[0]+Period()*60*15,R[7],Time[0]+Period()*60*15,-R[7],false,indicator_color7,8,WindowFind(ShortName),0,false);
fObjTrendLine(ObjNPref+"8",Time[0]+Period()*60*17,R[8],Time[0]+Period()*60*17,-R[8],false,indicator_color8,8,WindowFind(ShortName),0,false);


return(0);
}
//+------------------------------------------------------------------+

//浯蔡頌・湜跫韜 ・糺・鸙
void fObjLabel(
string aObjectName, // 1 韲
int aX, // 2 ・
int aY, // 3 ・
string aText, // 4 ・・
int aCorner=0, // 5 鸙 0 1
// 2 3
color aColor=Black, // 6 褪
int aFontSize=8, // 7 銕褞 頡
int aWindowNumber=0, // 8 鶴濵
string aFont="Arial Black", // 9 頡・
bool aBack=false // 10 ・
){


if(ObjectFind(aObjectName)!=aWindowNumber){
ObjectCreate(aObjectName,OBJ_LABEL,aWindowNumber,0,0);
}
ObjectSet(aObjectName,OBJPROP_XDISTANCE,aX);
ObjectSet(aObjectName,OBJPROP_YDISTANCE,aY);
ObjectSetText(aObjectName,aText,aFontSize,aFont,aColor);
ObjectSet(aObjectName,OBJPROP_BACK,aBack);
ObjectSet(aObjectName,OBJPROP_CORNER,aCorner);
}

//ⅳ粲・粢韭 ・湜・
void fObjTrendLine(
string aObjectName, // 1 韲
datetime aTime_1, // 2 糅褌 1
double aPrice_1, // 3 浯 1
datetime aTime_2, // 4 糅褌 2
double aPrice_2, // 5 浯 2
bool aRay=false, // 6 ・・
color aColor=Black, // 7 褪
int aWidth=1, // 8 ・竟・
int aWindowNumber=0, // 9 鶴濵
int aStyle=1, // 10 0-STYLE_SOLID, 1-STYLE_DASH, 2-STYLE_DOT, 3-STYLE_DASHDOT, 4-STYLE_DASHDOTDOT
bool aBack=false // 11 ・
){
if(ObjectFind(aObjectName)!=aWindowNumber){
ObjectCreate(aObjectName,OBJ_TREND,aWindowNumber,aTime_1,aPrice_1,aTime_2,aPrice_2);
}
ObjectSet(aObjectName,OBJPROP_TIME1,aTime_1);
ObjectSet(aObjectName,OBJPROP_PRICE1,aPrice_1);
ObjectSet(aObjectName,OBJPROP_TIME2,aTime_2);
ObjectSet(aObjectName,OBJPROP_PRICE2,aPrice_2);
ObjectSet(aObjectName,OBJPROP_RAY,aRay);
ObjectSet(aObjectName,OBJPROP_COLOR,aColor);
ObjectSet(aObjectName,OBJPROP_WIDTH,aWidth);
ObjectSet(aObjectName,OBJPROP_BACK,aBack);
ObjectSet(aObjectName,OBJPROP_STYLE,aStyle);
}


int fLinearRegressionAll2(int i0,int i1, int aPrice, int & aPeriod, double & aVal_0, double & aVal_1, double & aB, double & aMaxDev, double & aStdError, double & aRSquared,double & aArr[]){
int rRetError=0;
double x,y,y1,y2,sumy,sumx,sumxy,sumx2,sumy2,sumx22,sumy22,div1,div2;
aPeriod=i1-i0+1;
sumy=0.0;sumx=0.0;sumxy=0.0;sumx2=0.0;sumy2=0.0;
for(int i=0; i
y=iMA(NULL,0,1,0,0,aPrice,i0+i);
x=i;
sumy+=y;
sumxy+=y*i;
sumx+=x;
sumx2+=MathPow(x,2);
sumy2+=MathPow(y,2);
}
sumx22=MathPow(sumx,2);
sumy22=MathPow(sumy,2);
div1=sumx2*aPeriod-sumx22;
div2=MathSqrt((aPeriod*sumx2-sumx22)*(aPeriod*sumy2-sumy22));

//---- regression line ----

if(div1!=0.0){
aB=(sumxy*aPeriod-sumx*sumy)/div1;
aVal_0=(sumy-sumx*aB)/aPeriod;
aVal_1=aVal_0+aB*(aPeriod-1);
rRetError+=-1;
}
else{
rRetError+=-1;
}

//--- stderr & maxdev

aMaxDev=0;aStdError=0;

for(i=0;i
y1=iMA(NULL,0,1,0,0,aPrice,i0+i);
y2=aVal_0+aB*i;
aMaxDev=MathMax(MathAbs(y1-y2),aMaxDev);
aStdError+=MathPow(y1-y2,2);
}

aStdError=MathSqrt(aStdError/aPeriod);

//--- rsquared ---

if(div2!=0){
aRSquared=MathPow((aPeriod*sumxy-sumx*sumy)/div2,2);
}
else{
rRetError+=-2;
}

//----

ArrayResize(aArr,aPeriod);
for(i=0; i
y=iMA(NULL,0,1,0,0,aPrice,i0+i);
x=aVal_0+i*(aVal_1-aVal_0)/aPeriod;
aArr[i]=y-x;
}
return(rRetError);
}

void fFurie(double aArr[],double & aA[],double & aB[],double & aR[], double & aF[]){
int tN=ArraySize(aArr);
int tM=tN/2;

ArrayResize(aA,tM);
ArrayResize(aB,tM);
ArrayResize(aR,tM);
ArrayResize(aF,tM);

for (int ti=1;ti
aA[ti]=0;
aB[ti]=0;
for(int tj=0;tj
aA[ti]+=aArr[tj]*MathSin(ti*6.28*tj/tN);
aB[ti]+=aArr[tj]*MathCos(ti*6.28*tj/tN);
}
aA[ti]=2*aA[ti]/tN;
aB[ti]=2*aB[ti]/tN;
aR[ti]=MathSqrt(MathPow(aA[ti],2)+MathPow(aB[ti],2));
aF[ti]=fMyArcTan(aB[ti],aA[ti]);
}

}

double fMyArcTan(double aS,double aC){
if(aS==0){
return(0);
}
if(aC==0){
if(aS>0){
return(MathArctan(1)*2);
}
else{
if(aS<0){
return(MathArctan(1)*6);
}
}
}
else{
if(aS>0){
if(aC>0){
return(MathArctan(aS/aC));
}
else{
return(MathArctan(aS/aC)+MathArctan(1)*4);
}
}
else{
if(aC>0){
return(MathArctan(aS/aC)+MathArctan(1)*8);
}
else{
return(MathArctan(aS/aC)+MathArctan(1)*4);
}
}
}
}

void fObjDeleteByPrefix(string aPrefix){
for(int i=ObjectsTotal()-1;i>=0;i--){
if(StringFind(ObjectName(i),aPrefix,0)==0){
ObjectDelete(ObjectName(i));
}
}
}


FXの逆指値トラップリピート自動売買のMQL4プログラムを書いてください

2023-03-07 12:58:18 | FX
ChatGPTへの質問
「FXの逆指値トラップリピート自動売買のMQL4プログラムを書いてください」

ChatGPTからの回答
「以下は、MetaTrader 4(MT4)用のMQL4言語で逆指値トラップリピート自動売買を行うプログラムの例です。このプログラムは、逆指値注文を使用してトレーリングストップを設定し、売買回数が制限回数に達するまでリピートしてトレードを続けます。
// 外部パラメーター
extern double TakeProfit = 50; // 利益確定ピップス
extern double StopLoss = 30; // 損切りピップス
extern double TrailingStop = 20; // トレーリングストップピップス
extern int MaxOrders = 5; // 最大取引回数

// グローバル変数
double BuyPrice = 0, SellPrice = 0;
int OrdersCount = 0;

// オンライン処理
void OnTick() {

// 売買回数が最大回数に達したら終了する
if (OrdersCount >= MaxOrders) {
return;
}

// ポジションが無ければ新しい注文を出す
if (PositionsTotal() == 0) {

// 逆指値注文で買いエントリー
double BuyEntry = Ask + StopLoss * Point;
double BuyStopLoss = Bid - StopLoss * Point;
double BuyTakeProfit = Ask + TakeProfit * Point;
int BuyTicket = OrderSend(_Symbol, OP_BUYSTOP, 1.0, BuyEntry, 3, BuyStopLoss, BuyTakeProfit, "Buy Order", 0, 0, Blue);
// 注文が成功したら取引回数を増やす
if (BuyTicket > 0) {
OrdersCount++;
BuyPrice = BuyEntry;
}
}
// ポジションがあればトレーリングストップを更新する
else {
// 買いポジションの場合
if (PositionSelect("Buy") == true) {
// トレーリングストップを更新する
double BuyTrailingStop = BuyPrice + TrailingStop * Point;
bool BuyOrderModified = OrderModify(OrderTicket(), BuyPrice, BuyTrailingStop, BuyTakeProfit, 0, Blue);
// 注文が成功したらトレーリングストップを更新する
if (BuyOrderModified == true) {
BuyPrice = BuyTrailingStop;
}
}
// 売りポジションの場合
else if (PositionSelect("Sell") == true) {
// トレーリングストップを更新する
double SellTrailingStop = SellPrice - TrailingStop * Point;
bool SellOrderModified = OrderModify(OrderTicket(), SellPrice, SellTrailingStop, SellTakeProfit, 0, Red);
// 注文が成功したらトレーリングストップを更新する
if (SellOrderModified == true) {
SellPrice = SellTrailingStop;
}
}

追加の質問
では任意のpipes間隔で多段の逆指値を入れるプログラムは?

追加の回答
「以下は、MT4のMQL4言語を使用して、任意のピップ間隔で多段の逆指値を設定する逆指値トラップリピート自動売買プログラムの例です。このプログラムは、指定されたピップ間隔ごとに、逆指値注文を使用してトレーリングストップを設定します。同じピップ間隔で複数のトレーリングストップを設定するため、 for ループを使用して逆指値注文を生成し、その注文をリストに格納します。」
// 外部パラメーター
extern double TakeProfit = 50; // 利益確定ピップス
extern double StopLoss = 30; // 損切りピップス
extern double TrailingStopInterval = 10; // トレーリングストップピップスの間隔
extern int MaxOrders = 5; // 最大取引回数

// グローバル変数
double BuyPrice = 0, SellPrice = 0;
int OrdersCount = 0;
int TrailingStopCount = 0;
datetime LastTrailingStopTime;

// 注文を格納するリスト
struct OrderData {
int ticket;
double price;
};
OrderData BuyOrders[];
OrderData SellOrders[];

// オンライン処理
void OnTick() {

// 売買回数が最大回数に達したら終了する
if (OrdersCount >= MaxOrders) {
return;
}

// ポジションが無ければ新しい注文を出す
if (PositionsTotal() == 0) {

// 指定されたピップ間隔ごとに逆指値注文を生成する
for (int i=0; i<=TrailingStopCount; i++) {
// 買い注文の場合
double BuyEntry = Ask + (StopLoss + i * TrailingStopInterval) * Point;
double BuyStopLoss = Bid - (StopLoss + i * TrailingStopInterval) * Point;
double BuyTakeProfit = Ask + TakeProfit * Point;
int BuyTicket = OrderSend(_Symbol, OP_BUYSTOP, 1.0, BuyEntry, 3, BuyStopLoss, BuyTakeProfit, "Buy Order", 0, 0, Blue);
// 注文が成功したら取引回数を増やす
if (BuyTicket > 0) {
OrdersCount++;
OrderData newOrder;
newOrder.ticket = BuyTicket;
newOrder.price = BuyEntry;
BuyOrders[ArraySize(BuyOrders)] = newOrder;
}
// 売り注文の場合
double SellEntry = Bid - (StopLoss + i * TrailingStopInterval) * Point;
double SellStopLoss = Ask + (StopLoss + i * TrailingStopInterval) * Point;
double SellTakeProfit = Bid - TakeProfit * Point;
int SellTicket = OrderSend(_Symbol, OP_SELLSTOP, 1.0, SellEntry,

FXのヒストリカルデーターCSVファイルをリアルタイムで取得する方法

2023-03-06 22:08:19 | FX

FXのヒストリカルデーターCSVファイルをリアルタイムで取得する方法をChatGPTに尋ねてみた。

FXのヒストリカルデータをリアルタイムで取得するには、以下の方法があります。

  1. APIを使用する:FXデータプロバイダーが提供するAPIを使用して、リアルタイムでFXデータを取得できます。一般的なFXデータプロバイダーには、OANDA、FXCM、IGなどがあります。これらのAPIを使用することで、高速で正確なデータを取得できます。ただし、APIの利用には認証情報が必要であり、また一定の利用料が必要な場合があります。

  2. WebSocketを使用する:WebSocketを使用して、FXデータをリアルタイムで受信することができます。WebSocketは、Webブラウザとサーバー間で双方向の通信を実現するための技術であり、FXデータをリアルタイムで受信することができます。WebSocketを使用することで、APIよりも高速でリアルタイムのデータを取得することができます。

  3. MT4/MT5を使用する:MetaTrader 4(MT4)やMetaTrader 5(MT5)などのプラットフォームを使用することで、FXデータをリアルタイムで取得することができます。これらのプラットフォームは、FX取引において広く使用されており、多くのFXデータプロバイダーが対応しています。ただし、MT4/MT5を使用するためには、プラットフォームをダウンロードし、インストールする必要があります。

  4. スクレイピングを使用する:WebサイトからFXデータをスクレイピングすることで、リアルタイムでデータを取得することができます。ただし、スクレイピングにはWebサイトの利用規約に違反する可能性があるため、注意が必要です。また、Webサイトの構造が変更された場合には、スクレイピングが正常に動作しなくなる可能性があるため、定期的なメンテナンスが必要です。


MQL4をPythonに変換するトランスパイラは?

2023-03-05 11:26:10 | FX

MQL4をPythonに変換するトランスパイラは?

ChatGPTに訊いてみた。回答は…

MQL4をPythonに変換するトランスパイラとしては、現在は公式にサポートされているものはありません。しかし、いくつかのコミュニティーによって開発されたMQL4からPythonへの変換ツールがあります。

以下はいくつかのMQL4からPythonへの変換ツールの例です。

mql4py (https://github.com/PaulGib/mql4py)

このライブラリは、MQL4のコードをPythonコードに変換することができます。ただし、現在は開発が停止しているようです。

mql4-metatrader4-to-python (https://github.com/LeoReentry/mql4-metatrader4-to-python)

このツールは、MQL4スクリプトをMetaTrader 4ターミナルにインストールして実行し、Pythonでのコンバージョンを可能にします。しかしながら、その効果は制限されているため、正確な変換が得られない場合があります。

これらのツールは、MQL4からPythonへの変換に役立つかもしれませんが、完全な自動変換は不可能であるため、手動での変換が必要な場合があります。

…だそうだ。


Talibライブラリに新しく指標を登録するには?

2023-03-05 09:09:34 | FX
ChatGPTの威力を堪能した!
Talibライブラリに新しく指標を登録したい
と質問してみたら、約3秒で下記の回答が表示された!
TalibはPythonで書かれたテクニカル分析のためのライブラリです。
新しい指標を追加するには、Talibのコードを編集して指標を実装する必要があります。
以下の手順に従って、Talibに新しい指標を追加することができます。
① TalibのGitHubリポジトリをフォークして、ローカルマシンにクローンします。
② talib/func ディレクトリ内に、新しい指標のためのPythonファイルを作成します。ファイル名は、新しい指標の名前に基づいてください。
③ Pythonファイル内に、新しい指標を実装します。Talibの指標の実装については、既存の指標の実装を参考にすることができます。ただし、新しい指標を実装する場合は、必要に応じて、新しいアルゴリズムを考える必要があります。
④ talib/func/__init__.py ファイル内で、新しい指標をインポートし、FUNCTIONS リストに追加します。FUNCTIONS リストは、Talibのすべての指標を保持するリストであり、新しい指標を追加することで、Talibがその指標を認識するようになります。
⑤ コードの変更を反映させるために、Talibを再インストールします。以下のコマンドを実行します。
sh Copy code pip uninstall talib pip install .
⑥新しい指標を使用するために、PythonスクリプトでTalibをインポートし、新しい指標を使用します。
python Copy code import talib # 新しい指標を使用する output = talib.new_indicator(inputs, ...)
以上の手順に従って、Talibに新しい指標を追加することができます。ただし、Talibのコードを変更することは、バグを導入する可能性があるため、慎重に行うことが重要です。また、変更を公開する前に、テストを実行して、問題がないことを確認することも重要です。

ちなみにSpectrometr separateは、あくまでもインジケータであってMACDみたいな指標ではないので、talibライブラリに登録できるかどうかは分からない。
やってみる価値はあると思う。

新しく指標を作ったという方は、ドンドンtalibのライブラリに登録して欲しい。





XMTradingでは仮想通貨取引も可能らしい

2023-03-02 23:54:13 | FX

ビットコインなら米ドル、ユーロ、ポンドとのペアで取引可能らしい。

仮想通貨取引といえばブロックチェーン技術がお馴染み。

仮想通貨取引といったらアービトラージが連想されるが、XMTradingではアービトラージ取引は禁止されているとのこと。
つまり、XMTradingでアービトラージ取引をやってバレたら一発で口座をアボーンされるということだ。



この美人なおねーさんは誰かと思ったら、蛙亭・イワクラだった。


EAのデコンパイル屋さんwww

2023-02-28 04:32:18 | FX
LANCERSで面白いものを見つけた。
EA(MT4,MT5)(例ex4→mq4)のデコンパイルします。

EA(MT4,MT5)(例ex4→mq4)のデコンパイルします。

ランサーズで見積もり・カスタマイズの相談を承ります

lancers

見積り費用は62500円からとのこと。
俺としてはデコンパイルしてほしいEAが二つある。
どちらも逆指値トラリピ系だ。

ちょっと高いのでは?と思った。

Ghidraでデコンパイルできるかどうかは知らないが、試してみる価値はある!

他にも・・・

この手のカテゴリーは詐欺が横行しているらしいので気をつけた方がいいかも。