Saya telah mengunduh EA bola salju 7bit ke akun uang sungguhan dengan FX Solutions UK. dan juga ke demo dengan FX Solutions Australia. Keduanya merupakan platform 4 digit. Saya mencoba mencari tahu mengapa ini bekerja dengan baik di Aus. demo tetapi memiliki beberapa masalah pada uang riil Inggris dan Inggris. demo. Platform Inggris melakukan perdagangan sebagaimana mestinya tetapi tidak membentuk garis BE pada grafik sebagaimana mestinya. Seharusnya mengambil keuntungan jarak tertentu melewati garis BE ini. Saya berpikir karena tidak ada garis BE yang dihasilkan, fungsi TP tidak akan berfungsi. Saya pikir itu harus sesuatu dengan platform bukan kode. Saya telah mengizinkan impor DLL sehingga tidak menjadi masalah. Jika ada yang bisa membantu saya agar ini berfungsi, saya akan sangat menghargainya. EA ini terlihat sangat menguntungkan dalam tes kembali. Ini kode-
-------------------------------------------------- ----------------
//| Hak Cipta © 2010, Bernd Kreuss |
//| Sumbangan PayPal buka di sini |
// ----------------------------------------------- -------------------
#property hak cipta © Bernd Kreuss, Versi 2010.6.11.1
#property link http://sites.google.com/site/prof7bit/

#include lt; common_functions.mqhgt;
#include lt; offline_charts.mqhgt;
//# include lt; oanda.mqhgt;

extern lot ganda = 0,01;/banyak yang digunakan per perdagangan
//extern double oanda_factor = 25000;
extern int stop_distance = 20;
extern int auto_tp = 2;/auto-takeprofit banyak level ini (secara kasar) di atas titik BE
extern bool is_ecn_broker = false;/prosedur pesanan pasar yang berbeda saat melanjutkan setelah jeda

extern color clr_breakeven_level = Kapur;
extern color clr_buy = Biru;
extern color clr_sell = Merah;
extern color clr_gridline = Kapur;
extern color clr_stopline_active = Magenta;
extern color clr_stopline_triggered = Aqua;
extern string sound_grid_trail =;
extern string sound_grid_step =;
extern string sound_order_triggered =;
extern string sound_stop_all =;

nama string = salju;

pip ganda;
double points_per_pip;
komentar string;
sihir int;
bool running;
arah int;
gandakan last_line;
tingkat int;/level saat ini, masuk, minus = pendek, dihitung dalam perdagangan ()
ganda terealisasi;/total terealisasi (sepanjang waktu) (dihitung dalam info ())
gandakan cycle_total_profit;/total laba sejak siklus dimulai (dihitung dalam info ())
double stop_value;/dolar (akun) per tingkat tunggal (dihitung dalam info ())
gandakan auto_tp_price;/harga tempat pemicu auto_tp, dihitung saat break even calc
gandakan auto_tp_profit;/estimasi kasar laba auto_tp, dihitung saat break even calc.

#define SP

//arah perdagangan
#definisikan BIDIR 0
#define PANJANG 1
#define SINGKAT 2


void defaults () {
/*
IS_ECN_BROKER = true;
//auto_tp = 2;

if (IsTesting ()) {
return (0);
}
if (Symbol6 () == GBPUSD) {
lot = 0,1;
oanda_factor = 900;
stop_distance = 30;
}
if (Symbol6 () == EURUSD) {
lot = 0,1;
oanda_factor = 1800;
stop_distance = 30;
}
if (Symbol6 () == USDCHF) {
lot = 0,1;
oanda_factor = 1800;
stop_distance = 20;
}
if (Symbol6 () == USDJPY) {
lot = 0,1;
oanda_factor = 1800;
stop_distance = 30;
}

sound_grid_step = expert.wav;
sound_grid_trail = alert2.wav;
sound_stop_all = alert.wav;
sound_order_triggered = alert.wav;
*
}


int init () {
if (! IsDllsAllowed ()) {
MessageBox (Impor DLL harus diizinkan!, Bola Salju);
return (-1);
}

IS_ECN_BROKER = is_ecn_broker;
CLR_BUY_ARROW = clr_buy;
CLR_SELL_ARROW = clr_sell;
CLR_CROSSLINE_ACTIVE = clr_stopline_active;
CLR_CROSSLINE_TRIGGERED = clr_stopline_triggered;

default ();

points_per_pip = pointsPerPip ();
pip = Point * points_per_pip;

comment = name _ Symbol6 ();
magic = makeMagicNumber (name _ Symbol ());

if (last_line == 0) {
last_line = getLine ();
}

if (IsTesting ()) {
setGlobal (menyadari, 0);
setGlobal (running, 0);
}

readVariables ();

if (IsTesting ()! IsVisualMode ()) {
Cetak (!!! Ini bukan egy otomatis! Backtesting otomatis tidak masuk akal! Mulai dalam mode dua arah!);
running = true;
direction = BIDIR;
placeLine (Bid);
}

info ();
}

int deinit () {
deleteStartButtons ();
deleteStopButtons ();
storeVariables ();
if (UninitializeReason () == REASON_PARAMETERS) {
Komentar (Parameter berubah, pesanan tertunda dihapus, akan diganti dengan centang selanjutnya);
closeOpenOrders (OP_SELLSTOP, magic);
closeOpenOrders (OP_BUYSTOP, magic);
}lain{
Komentar (EA dihapus, buka pesanan, perdagangan dan status tidak tersentuh!);
}
}

batal onTick () {
recordEquity (nama Symbol6 (), PERIOD_H1, magic);
//checkOanda (magic, oanda_factor);
checkLines ();
checkButtons ();
perdagangan();
info ();
checkAutoTP ();
if (! IsTesting ()) {
plotNewOpenTrades (ajaib);
plotNewClosedTrades (ajaib);
}
}

batal onOpen () {
}

membatalkan storeVariables () {
setGlobal (berlari, berlari);
setGlobal (arah, arah);
}

batal readVariables () {
running = getGlobal (running);
direction = getGlobal (direction);
}

batal deleteStartButtons () {
ObjectDelete (start_long);
ObjectDelete (start_short);
ObjectDelete (start_bidir);
}

batal deleteStopButtons () {
ObjectDelete (stop);
ObjectDelete (jeda);
}

/**
* tandai awal (atau melanjutkan) dari siklus dalam bagan
*
batal startArrow () {
string aname = cycle_start_ TimeToStr (TimeCurrent ());
ObjectCreate (aname, OBJ_ARROW, 0, TimeCurrent (), Tutup [0]);
ObjectSet (aname, OBJPROP_ARROWCODE, 5);
ObjectSet (aname, OBJPROP_COLOR, clr_gridline);
ObjectSet (aname, OBJPROP_BACK, true);
}

/**
* tandai bagian akhir (atau jeda) dari siklus dalam bagan
*
batal endArrow () {
string aname = cycle_end_ TimeToStr (Waktu [0]);
ObjectCreate (aname, OBJ_ARROW, 0, TimeCurrent (), Tutup [0]);
ObjectSet (aname, OBJPROP_ARROWCODE, 6);
ObjectSet (aname, OBJPROP_COLOR, clr_gridline);
ObjectSet (aname, OBJPROP_BACK, true);
}

batal berhenti () {
endArrow ();
deleteStopButtons ();
closeOpenOrders (-1, magic);
running = false;
storeVariables ();
setGlobal (menyadari, getProfitRealized (magic));/simpan ini hanya di dekat piramida
//checkOanda (magic, oanda_factor);
if (sound_stop_all! =) {
PlaySound (sound_stop_all);
}
}

batal pergi (mode int) {
startArrow ();
deleteStartButtons ();
running = true;
direction = mode;
storeVariables ();
lanjut();
}

batal jeda () {
endArrow ();
deleteStopButtons ();
label (paused_level, 15, 100, 1, level, Yellow);
closeOpenOrders (-1, magic);
running = false;
storeVariables ();
//checkOanda (magic, oanda_factor);
if (sound_stop_all! =) {
PlaySound (sound_stop_all);
}
}

/**
* melanjutkan perdagangan setelah kami menjeda itu.
* Temukan label teks yang berisi level tempat kita menekan jeda
* dan buka kembali jumlah lot yang sesuai, lalu hapus labelnya.
*
membatalkan resume () {
int i;
double sl;
garis ganda = getLine ();
level = StrToInteger (ObjectDescription (paused_level));

if (direction == LONG) {
level = MathAbs (level);
}

if (direction == PENDEK) {
level = -MathAbs (level);
}

if (level gt; 0) {
untuk (i = 1; ilt; = level; i ) {
sl = baris - pip * i * stop_distance;
beli (lot, sl, 0, magic, comment);
}
}

if (level lt; 0) {
untuk (i = 1; ilt; = - level; i ) {
sl = baris pip * i * stop_distance;
sell (lot, sl, 0, magic, comment);
}
}

ObjectDelete (paused_level);
}

membatalkan checkLines () {
if (crossedLine (stop)) {
berhenti();
}
if (crossedLine (jeda)) {
jeda ();
}
if (crossedLine (start long)) {
pergi (PANJANG);
}
if (crossedLine (start short)) {
pergi (PENDEK);
}
if (crossedLine (start bidir)) {
go (BIDIR);
}
}

batal checkButtons () {
if (! running) {
deleteStopButtons ();
if (labelButton (start_long, 15, 15, 1, start long, Lime)) {
pergi (PANJANG);
}
if (labelButton (start_short, 15, 30, 1, start pendek, Lime)) {
pergi (PENDEK);
}
if (labelButton (start_bidir, 15, 45, 1, start bidirectional, Lime)) {
go (BIDIR);
}
}

if (running) {
deleteStartButtons ();
if (labelButton (stop, 15, 15, 1, stop, Red)) {
berhenti();
}
if (labelButton (jeda, 15, 30, 1, jeda, Kuning)) {
jeda ();
}
}
}

batal checkAutoTP () {
if (auto_tp gt; 0 auto_tp_price gt; 0) {
if (level gt; 0 Tutup [0] gt; = auto_tp_price) {
berhenti();
}
if (level lt; 0 Close [0] lt; = auto_tp_price) {
berhenti();
}
}
}

batal placeLine (harga dobel) {
horizLine (last_order, harga, clr_gridline, SP posisi grid);
last_line = harga;
WindowRedraw ();
}

gandakan getLine () {
return (ObjectGet (last_order, OBJPROP_PRICE1));
}

bool lineMoved () {
garis ganda = getLine ();
if (line! = last_line) {
//garis telah dipindahkan oleh kekuatan eksternal (halo wb ;-)
if (MathAbs (line - last_line) lt; stop_distance * pip) {
//penyesuaian kecil oleh pengguna
last_line = baris;
return (true);
}lain{
//sesuatu yang aneh (gap? crash? line dihapus?)
if (MathAbs (Bid - last_line) lt; stop_distance * pip) {
//variabel last_line masih dekat harga dan dengan demikian valid.
placeLine (last_line);/cukup ganti baris
return (false);/tidak diperlukan tindakan
}lain{
//baris jauh atau benar-benar hilang dan last_line tidak membantu juga
//buat baris yang benar-benar baru di Bid
placeLine (Bid);
return (true);
}
}
return (true);
}lain{
return (false);
}
}

/**
* mengelola semua penempatan pesanan entri
*
membatalkan perdagangan () {
mulai ganda;
last_level statis int;

if (lineMoved ()) {
closeOpenOrders (OP_SELLSTOP, magic);
closeOpenOrders (OP_BUYSTOP, magic);
}
start = getLine ();

//hitung level variabel global di sini/FIXME: neraka efek samping variabel global.
level = getNumOpenOrders (OP_BUY, magic) - getNumOpenOrders (OP_SELL, magic);

if (running) {
//apakah kita flat?
if (level == 0) {
if (direction == SINGKAT Tanya gt; mulai) {
if (getNumOpenOrders (OP_SELLSTOP, magic)! = 2) {
closeOpenOrders (OP_SELLSTOP, magic);
}lain{
moveOrders (Tanya - mulai);
}
placeLine (Ask);
mulai = Tanyakan;
plotBreakEven ();
if (sound_grid_trail! =) {
PlaySound (sound_grid_trail);
}
}

if (direction == LONG Bid lt; start) {
if (getNumOpenOrders (OP_BUYSTOP, magic)! = 2) {
closeOpenOrders (OP_BUYSTOP, magic);
}lain{
moveOrders (Tawaran - mulai);
}
placeLine (Bid);
mulai = Tawaran;
plotBreakEven ();
if (sound_grid_trail! =) {
PlaySound (sound_grid_trail);
}
}

//pastikan pesanan panjang pertama ada di tempat
if (direction == BIDIR || direction == LONG) {
pesanan panjang (mulai);
}

//pastikan pesanan singkat pertama sudah ada
if (direction == BIDIR || direction == PENDEK) {
Pesanan pendek (mulai);
}
}

//apakah kita sudah lama?
if (level gt; 0) {
//pastikan pesanan panjang berikutnya sudah ada
pesanan panjang (mulai);
}

//apakah kita pendek?
if (level lt; 0) {
//pastikan pesanan singkat berikutnya ada di tempat
Pesanan pendek (mulai);
}

//kami memiliki dua model berbeda cara memindahkan garis kisi.
//Jika kita * tidak * flat, kita bisa memasangnya ke level grid terdekat,
//ini lebih baik untuk menangani situasi di mana pesanan dipicu
//oleh pip yang tepat dan harga segera berbalik.
//Jika saat ini kita flat, kita * harus * memindahkannya hanya ketika kita telah mencapai
//itu * persis *, karena kalau tidak, ini akan sangat mengganggu
//jejak grid dalam mode searah. Juga di
//Mode dua arah ini akan memiliki beberapa efek yang tidak diinginkan.
if (level! = 0) {
//jepret ke kisi
if (Ask (pip * stop_distance6) gt; = start stop_distance * pip) {
jumpGrid (1);
}

//jepret ke kisi
if (Bid - (pip * stop_distance6) lt; = start - stop_distance * pip) {
jumpGrid (-1);
}
}lain{
//Jaringan mencapai tepat
if (Ask gt; = start stop_distance * pip) {
jumpGrid (1);
}

//Jaringan mencapai tepat
if (Bid lt; = start - stop_distance * pip) {
jumpGrid (-1);
}
}

//waspada saat perubahan level (pesanan terpicu, bukan garis yang dipindahkan)
if (level! = last_level) {
if (sound_order_triggered! =) {
PlaySound (sound_order_triggered);
}
last_level = level;
}

} else {//tidak berjalan
placeLine (Bid);
}
}

/**
* pindahkan baris 1 stop_didtance ke atas atau ke bawah.
* 1 berarti naik, -1 berarti turun.
*
membatalkan jumpGrid (int dir) {
placeLine (getLine () pip * stop_distance * dir);
if (sound_grid_step! =) {
PlaySound (sound_grid_step);
}
}

/**
* apakah kita perlu melakukan pemesanan baru pada harga ini?
* Ini dilakukan dengan mencari stop loss di bawah atau di atas harga
* di mana = -1 mencari stop loss di bawah ini, di mana = 1 mencari stop loss di atas harga
* return false jika sudah ada pesanan (terbuka atau tertunda)
*
bool needsOrder (harga dobel, int di mana) {
//return (false);
int i;
int total = OrdersTotal ();
tipe int;
//cari stop loss tepat pada satu jarak grid dari harga
untuk (i = 0; ilt; total; i ) {
Pilih Pesanan (i, SELECT_BY_POS, MODE_TRADES);
type = OrderType ();
if (where lt; 0) {//hanya mencari pesanan beli (berhenti di bawah)
if (OrderMagicNumber () == magic (type == OP_BUY || type == OP_BUYSTOP)) {
if (isEqualPrice (OrderStopLoss (), harga di mana * pip * stop_distance)) {
return (false);
}
}
}
if (where gt; 0) {//hanya mencari pesanan jual (berhenti di atas)
if (OrderMagicNumber () == magic (type == OP_SELL || type == OP_SELLSTOP)) {
if (isEqualPrice (OrderStopLoss (), harga di mana * pip * stop_distance)) {
return (false);
}
}
}
}
return (true);
}

/**
* Pastikan ada dua pesanan panjang berikutnya di atas mulai berlaku.
* Jika mereka sudah ada, jangan lakukan apa-apa, ganti yang hilang.
*
membatalkan pesanan panjang (mulai ganda) {
gandakan a = mulai stop_distance * pip;
dobel b = mulai 2 * stop_distance * pip;
if (needsOrder (a, -1)) {
buyStop (lot, a, start, 0, magic, comment);
}
if (needsOrder (b, -1)) {
buyStop (lot, b, a, 0, magic, comment);
}
}

/**
* Pastikan ada dua pesanan pendek berikutnya di bawah ini mulai berlaku.
* Jika mereka sudah ada, jangan lakukan apa-apa, ganti yang hilang.
*
membatalkan pesanan singkat (mulai ganda) {
gandakan a = mulai - stop_distance * pip;
dobel b = mulai - 2 * stop_distance * pip;
if (needsOrder (a, 1)) {
sellStop (lot, a, start, 0, magic, comment);
}
if (needsOrder (b, 1)) {
sellStop (lot, b, a, 0, magic, comment);
}
}

/**
* Memindahkan semua pesanan masuk dengan jumlah d
*
membatalkan pesananOrders (d ganda) {
int i;
untuk (i = 0; ilt; OrdersTotal (); i ) {
Pilih Pesanan (i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber () == magic) {
if (MathAbs (OrderOpenPrice () - getLine ()) gt; 3 * stop_distance * pip) {
orderDeleteR reliable (OrderTicket ());
}lain{
orderModify Reliable (
OrderTicket (),
OrderOpenHarga () d,
OrderStopLoss () d,
0,
0,
CLR_NONE
);
}
}
}
}

membatalkan info () {
mengambang ganda;
pb ganda, lp, tp;
last_ticket statis int;
datetime statis last_be_plot = 0;
tiket int;
string dir;

OrderSelect (OrdersHistoryTotal () - 1, SELECT_BY_POS, MODE_HISTORY);
ticket = OrderTicket ();

if (ticket! = last_ticket) {
//sejarah berubah, perlu menghitung ulang laba yang direalisasikan
realisasi = getProfitRealized (ajaib);
last_ticket = tiket;

//segera jalankan plot titik impas baru
last_be_plot = 0;
}

floating = getProfit (magic);

//variabel yang diwujudkan adalah total yang direalisasikan sepanjang masa.
//variabel MT4-global _realized adalah snapshot dari nilai ini saat
//EA direset terakhir kali. Perbedaannya adalah apa yang kami buat
//selama siklus saat ini. Tambahkan mengambang ke sana dan kita punya
//untung dari siklus saat ini.
cycle_total_profit = terealisasi - getGlobal (terwujud) mengambang;

if (running == false) {
dir = perdagangan berhenti;
}lain{
beralih (arah) {
kasing PANJANG:
dir = berdagang panjang;
istirahat;
case PENDEK:
dir = perdagangan pendek;
istirahat;
default:
dir = memperdagangkan kedua arah;
}
}

int level_abs = MathAbs (getNumOpenOrders (OP_BUY, magic) - getNumOpenOrders (OP_SELL, magic));
stop_value = MarketInfo (Symbol (), MODE_TICKVALUE) * banyak * stop_distance * points_per_pip;

Komentar (n SP nama sihir , dir
n SP 1 pip adalah DoubleToStr (pip, Digit) Symbol6 ()
n SP jarak berhenti: stop_distance pip, ukuran lot: DoubleToStr (lot, 2)
n SP setiap perhentian sama dengan DoubleToStr (stop_value, 2) AccountCurrency ()
n SP terealisasi: DoubleToStr (terealisasi - getGlobal (terealisasi), 2) mengambang: DoubleToStr (mengambang, 2)
n SP laba: DoubleToStr (cycle_total_profit, 2) AccountCurrency () level saat ini: level_abs
n SP auto-tp: auto_tp level ( DoubleToStr (auto_tp_price, Digit) , DoubleToStr (auto_tp_profit, 2) AccountCurrency () ));

if (last_be_plot == 0 || TimeCurrent () - last_be_plot gt; 300) {//setiap 5 menit
plotBreakEven ();
last_be_plot = TimeCurrent ();
}

//Jika Anda meletakkan objek teks (bukan label!) Dengan nama untung,
//di mana saja pada grafik maka ini dapat digunakan sebagai kalkulator laba.
//Kode berikut akan menemukan posisi objek teks ini
//dan hitung laba Anda, jika harga mencapai posisi ini
//dan kemudian tulis angka ini ke objek teks. Kamu bisa
//gerakkan saja pada grafik untuk mendapatkan proyeksi laba
//tingkat harga apa pun yang Anda inginkan.
if (ObjectFind (profit)! = -1) {
pb = getPyramidBase ();
lp = ObjectGet (laba, OBJPROP_PRICE1);
if (pb == 0) {
if (direction == PENDEK) {
pb = getLine () - stop_distance * pip;
}
if (direction == LONG) {
pb = getLine () stop_distance * pip;
}
if (direction == BIDIR) {
if (lp lt; getLine ()) {
pb = getLine () - stop_distance * pip;
}
if (lp gt; = getLine ()) {
pb = getLine () stop_distance * pip;
}
}
}
tp = getTheoreticProfit (MathAbs (lp - pb));
ObjectSetText (laba, ¯¯ DoubleToStr (MathRound (realisasi - getGlobal (realisasi) tp), 0) AccountCurrency () proyeksi laba ¯¯¯);
}

}

/**
* Plot panah. Default adalah simbol tanda hubung tepat harga
* Fungsi ini mungkin segera dipindahkan ke common_functions
*
panah string (nama string =, harga dobel = 0, waktu dat = 0, warna clr = Merah, int arrow_code = 4) {
if (time == 0) {
time = TimeCurrent ();
}
if (name ==) {
name = panah_ waktu;
}
if (price == 0) {
harga = Tawaran;
}
if (ObjectFind (name) lt; 0) {
ObjectCreate (nama, OBJ_ARROW, 0, waktu, harga);
}lain{
ObjectSet (nama, OBJPROP_PRICE1, harga);
ObjectSet (nama, OBJPROP_TIME1, waktu);
}
ObjectSet (nama, OBJPROP_ARROWCODE, arrow_code);
ObjectSet (nama, OBJPROP_SCALE, 1);
ObjectSet (nama, OBJPROP_COLOR, clr);
ObjectSet (nama, OBJPROP_BACK, true);
return (nama);
}

/**
* plot harga titik impas ke dalam grafik
*
membatalkan plotBreakEvenArrow (string arrow_name, harga dobel) {
panah (panah_name TimeCurrent (), harga, 0, clr_breakeven_level);
}


/**
* plot titik impas (hanya perkiraan kasar plus minus kurang dari satu perhentian jarak,
* itu akan menjadi paling tidak akurat sebelum memukul stop loss (negatif perdagangan terakhir).
* dan ini akan lebih jelas pada awal siklus baru ketika kerugian masih kecil
* dan break even step, kenaikan masih besar.
*
* Efek samping: Fungsi ini juga akan menghitung harga dan keuntungan auto-tp.
*
* FIXME: Seluruh perhitungan titik impas ini menghisap komet melalui sedotan!
* FIXME: Apakah tidak ada cara yang lebih elegan untuk menghitung titik impas?
*
membatalkan plotBreakEven () {
basis ganda = getPyramidBase ();
dobel menjadi = 0;

//Kerugian kira-kira adalah jumlah stop hit yang direalisasikan. Tapi saya tidak bisa menggunakan nomor ini
//langsung karena setelah melanjutkan piramida yang dijeda angka ini salah. Begitu
//Aku harus memperkirakannya dengan laba total (selalu akurat) dan arus
//jarak dari pangkalan. Dalam beberapa kasus, hasil dari perhitungan ini adalah sama
//ke kerugian yang direalisasikan seperti yang ditampilkan di layar, hanya ketika melanjutkan piramida
//itu akan berbeda dan memiliki nilai yang akan dimiliki jika piramida tidak pernah dijeda.
double distance = MathAbs (Close [0] - base);
if ((level gt; 0 Tutup [0] lt; basis) || (level lt; 0 Tutup [0] gt; basis) || level == 0) {
jarak = 0;
}
kerugian ganda = - (cycle_total_profit - getTheoreticProfit (jarak));

//nilai ini harus selalu positif
//atau 0 (atau sedikit di bawah (kesalahan pembulatan)) jika kita memiliki piramida segar.
//Jika tidak positif (belum ada kerugian) maka kita tidak perlu merencanakan impas.
if (loss lt; = 0 ||! running) {
auto_tp_price = 0;
auto_tp_profit = 0;
return (0);
}

if (direction == LONG) {
if (base == 0) {
base = getLine () stop_distance * pip;
}
be = base getBreakEven (loss);
plotBreakEvenArrow (breakeven_long, be);
auto_tp_price = menjadi pip * stop_distance * auto_tp;
auto_tp_profit = getTheoreticProfit (MathAbs (auto_tp_price - base)) - loss;
}

if (direction == PENDEK) {
if (base == 0) {
base = getLine () - stop_distance * pip;
}
be = base - getBreakEven (loss);
plotBreakEvenArrow (breakeven_short, be);
auto_tp_price = be - pip * stop_distance * auto_tp;
auto_tp_profit = getTheoreticProfit (MathAbs (auto_tp_price - base)) - loss;
}

if (direction == BIDIR) {
if (base == 0) {
base = getLine () stop_distance * pip;
plot BreakEven Arrow (panjang impas, basis set BreakEven (loss));
base = getLine () - stop_distance * pip;
plot BreakEven Arrow (breakeven short, base-set BreakEven (loss));
auto_tp_price = 0;
auto_tp_profit = 0;
}lain{
if (getLotsOnTableSigned (magic) gt; 0) {
be = base getBreakEven (loss);
plotBreakEvenArrow (breakeven_long, be);
auto_tp_price = menjadi pip * stop_distance * auto_tp;
auto_tp_profit = getTheoreticProfit (MathAbs (auto_tp_price - base)) - loss;
}lain{
be = base - getBreakEven (loss);
plotBreakEvenArrow (breakeven_short, be);
auto_tp_price = be - pip * stop_distance * auto_tp;
auto_tp_profit = getTheoreticProfit (MathAbs (auto_tp_price - base)) - loss;
}
}
}

if (auto_tp lt; 1) {
auto_tp_price = 0;
auto_tp_profit = 0;
}
}


/**
* kembalikan harga masuk orde pertama piramida.
* kembalikan 0 jika kita flat.
*
gandakan getPyramidBase () {
d ganda, max_d, sl;
int i;
tipe int = -1;

//temukan stoploss yang paling jauh dari harga saat ini
//kita tidak bisa hanya menggunakan harga buka pesanan karena kita mungkin
//berada dalam mode resume dan kemudian semua perdagangan akan dibuka di
//harga yang sama. satu-satunya hal yang dapat diandalkan adalah bekerja
//melihat stoplossses
untuk (i = 0; ilt; OrdersTotal (); i ) {
Pilih Pesanan (i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber () == magic OrderType () lt; 2) {
d = MathAbs (Tutup [0] - OrderStopLoss ());
if (d gt; max_d) {
max_d = d;
sl = OrderStopLoss ();
type = OrderType ();
}
}
}

if (type == OP_BUY) {
return (sl pip * stop_distance);
}

if (type == OP_SELL) {
return (sl - pip * stop_distance);
}

return (0);
}

gandakan getPyramidBase1 () {
int i;
double pmax = -999999;
basis ganda = 0;
untuk (i = 0; ilt; OrdersTotal (); i ) {
Pilih Pesanan (i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber () == magic OrderType () lt; 2) {
if (OrderProfit () gt; pmax) {
base = OrderOpenPrice ();
pmax = OrderProfit ();
}
}
}
return (base);
}

/**
* mengembalikan laba mengambang yang akan dihasilkan jika
* harga akan menjadi jarak yang ditentukan dari
* Dasar piramida
*
double getTheoreticProfit (jarak ganda) {
int n = MathFloor (distance(stop_distance * pip));
tetap ganda = jarak - n * stop_distance * pip;
int mult = n * (n 1)2;
laba ganda = MarketInfo (Simbol (), MODE_TICKVALUE) * banyak * stop_distance * points_per_pip * mult;
laba = laba MarketInfo (Simbol (), MODE_TICKVALUE) * banyak * (tetapPoin) * (n 1);
return (laba);
}

/**
* mengembalikan pergerakan harga relatif terhadap basis yang diperlukan untuk mengkompensasi kerugian yang direalisasi
* FIXME: Algoritma ini tidak memenuhi syarat sebagai elegan, bahkan tidak jauh.
*
double getBreakEven (kerugian ganda) {
gandakan i = 0;

while (true) {
if (atur Profit Teori (pip * i) dapatkan; kerugian) {
istirahat;
}
i = stop_distance;
}

i - = stop_distance;
while (true) {
if (atur Profit Teori (pip * i) dapatkan; kerugian) {
istirahat;
}
i = 0,1;
}

return (pip * i);
}

int start () {
numbars int statis;
onTick ();
if (Bar == numbars) {
return (0);
}
numbars = Bar;
onOpen ();
return (0);
}

membatalkan setGlobal (kunci string, nilai ganda) {
GlobalVariableSet (nama sihir _ kunci, nilai);
}

getGlobal ganda (kunci string) {
return (GlobalVariableGet (name magic _ key));