وعليكم السلام ورحمة الله وبركاته
هذا مثال
كود PHP:
double NextLot=AccountBalance()*Lot/(AccountBalance()-AccountProfit());
Printable View
للاسف الاخ MR.dollar لم افلح في تركيب الكود :016: لانني جديد في البرمجة
يبدو الاكسبيرت معقد ممكن اتركبنا الكود و هدا هو قسم الستارت
او احملك الاكسبيرت ؟
كود PHP :
كود PHP:
int start() {
double ld_200;
double ld_208;
if (RiskMM) {
if (Risk < 0.1 || Risk > 100.0) {
Comment("Invalid Risk Value.");
return (0);
}
LotsBuy = MathFloor(100.0 * (AccountFreeMargin() * AccountLeverage() * Risk * Point) / (Ask * MarketInfo(Symbol(), MODE_LOTSIZE) * MarketInfo(Symbol(), MODE_MINLOT))) * MarketInfo(Symbol(), MODE_MINLOT);
LotsSell = MathFloor(100.0 * (AccountFreeMargin() * AccountLeverage() * Risk * Point) / (Ask * MarketInfo(Symbol(), MODE_LOTSIZE) * MarketInfo(Symbol(), MODE_MINLOT))) * MarketInfo(Symbol(), MODE_MINLOT);
}
if (RiskMM == FALSE) {
}
if (gd_672 != 0.0 && MinProfit > 0.0) {
if (gd_672 <= AccountBalance() && AccountBalance() <= gd_672 + MinProfit) Multiplier = 1;
else {
if (AccountBalance() < gd_672) {
}
}
}
gd_672 = AccountBalance();
double ld_0 = 0;
ld_0 = AccountEquity() - AccountBalance();
if (ld_0 < gd_684) gd_684 = ld_0;
string ls_8 = "false";
if (UseBasketLoss == TRUE && ld_0 <= (-1 * BasketLoss)) ls_8 = "true";
double ld_16 = 0;
double ld_24 = 0;
string l_symbol_32 = OrderSymbol();
double l_spread_40 = MarketInfo(l_symbol_32, MODE_SPREAD);
double l_digits_48 = MarketInfo(l_symbol_32, MODE_DIGITS);
double l_minlot_56 = MarketInfo(l_symbol_32, MODE_MINLOT);
double l_ima_64 = iMA(Symbol(), 0, MaPeriod, 0, MaMode, MaPrice, 1);
double l_istochastic_72 = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing, MODE_LWMA, 1, MODE_MAIN, 1);
double l_istochastic_80 = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing, MODE_LWMA, 1, MODE_SIGNAL, 1);
string ls_88 = "false";
string ls_96 = "false";
if (l_istochastic_72 > l_istochastic_80) ls_88 = "true";
if (l_istochastic_72 < l_istochastic_80) ls_96 = "true";
string ls_104 = "false";
string ls_112 = "false";
if (ExtendedZone == FALSE && l_istochastic_80 < SimpleZoneBuy) ls_104 = "true";
if (ExtendedZone == FALSE && l_istochastic_80 > SimpleZoneSell) ls_112 = "true";
if (ExtendedZone == TRUE && l_istochastic_80 > StartZoneBuy && l_istochastic_80 < EndZoneBuy) ls_104 = "true";
if (ExtendedZone == TRUE && l_istochastic_80 > StartZoneSell && l_istochastic_80 < EndZoneSell) ls_112 = "true";
string ls_120 = "false";
string ls_128 = "false";
if (ExtendedZone == TRUE && l_istochastic_80 <= CloseLevelDnSell || l_istochastic_80 >= CloseLevelUpSell) ls_120 = "true";
if (ExtendedZone == TRUE && l_istochastic_80 >= CloseLevelUpBuy || l_istochastic_80 <= CloseLevelDnBuy) ls_128 = "true";
string ls_136 = "false";
string ls_144 = "false";
if (Ask > l_ima_64 || MaFilter == FALSE) ls_136 = "true";
if (Bid < l_ima_64 || MaFilter == FALSE) ls_144 = "true";
string ls_152 = "false";
if (MaxSpread == MaxSpread || UseMaxSpread == FALSE) ls_152 = "true";
string ls_160 = "false";
string ls_168 = "false";
if (OrdersTotalMagicBuy(g_magic_440) < MaxBuyOrders || MaxOpenOrders == FALSE) ls_160 = "true";
if (OrdersTotalMagicSell(g_magic_448) < MaxSellOrders || MaxOpenOrders == FALSE) ls_168 = "true";
string ls_176 = "false";
if (AccountEquity() < EquityTarget || UseEquityTarget == FALSE) ls_176 = "true";
string ls_184 = "false";
if (TimeFilter == TRUE && !(Hour() < StartHour || Hour() >= EndHour)) ls_184 = "true";
string ls_192 = "false";
if (CloseFriday == TRUE && DayOfWeek() == 5 && TimeCurrent() >= StrToTime(CloseFridayHour + ":00")) ls_192 = "true";
if (l_minlot_56 == 0.01) {
gd_632 = 2;
if (maxLot <= 0.0) maxLot = MarketInfo(l_symbol_32, MODE_MAXLOT);
}
if (l_minlot_56 == 0.1) {
gd_632 = 1;
if (maxLot <= 0.0) maxLot = AccountBalance() / 2.0 / 1000.0;
}
if (OrdersTotalMagicBuy(g_magic_440) > 0) {
for (g_pos_552 = 0; g_pos_552 < OrdersTotal(); g_pos_552++) {
OrderSelect(g_pos_552, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_440) {
g_ticket_692 = OrderTicket();
OrderSelect(g_ticket_692, SELECT_BY_TICKET, MODE_TRADES);
ld_200 += OrderLots();
g_ord_open_price_456 = OrderOpenPrice();
g_ord_lots_488 = OrderLots();
}
}
if (ld_200 + NormalizeDouble(g_ord_lots_488 * Multiplier, gd_632) < maxLot) {
if (StepMode == 0) {
if (Ask <= g_ord_open_price_456 - Step * Point && ls_136 == "true" && ls_152 == "true" && ls_160 == "true" && ls_176 == "true" && ls_192 == "false" && ls_88 == "true" &&
ls_104 == "true" && ls_184 == "false") {
g_ord_lots_472 = Multiplier * LotsBuy * OrdersTotalMagicBuy(g_magic_440);
if (TakeProfit > 0.0) g_price_520 = Ask + TakeProfit * Point;
else g_price_520 = 0;
if (StopLoss > 0.0) g_price_536 = Ask - StopLoss * Point;
else g_price_536 = 0;
RefreshRates();
g_ticket_692 = OrderSend(Symbol(), OP_BUY, NormalizeDouble(g_ord_lots_472, gd_632), Ask, 3, g_price_536, g_price_520, "Trader Doni irawan ST", g_magic_440, 0, Blue);
}
}
if (StepMode == 1) {
if (Ask <= g_ord_open_price_456 - (Step + OrdersTotalMagicBuy(g_magic_440) + OrdersTotalMagicBuy(g_magic_440) - 2.0) * Point && ls_136 == "true" && ls_152 == "true" &&
ls_160 == "true" && ls_176 == "true" && ls_192 == "false" && ls_88 == "true" && ls_104 == "true" && ls_184 == "false") {
g_ord_lots_472 = Multiplier * LotsBuy * OrdersTotalMagicBuy(g_magic_440);
if (TakeProfit > 0.0) g_price_520 = Ask + TakeProfit * Point;
else g_price_520 = 0;
if (StopLoss > 0.0) g_price_536 = Ask - StopLoss * Point;
else g_price_536 = 0;
RefreshRates();
g_ticket_692 = OrderSend(Symbol(), OP_BUY, NormalizeDouble(g_ord_lots_472, gd_632), Ask, 3, g_price_536, g_price_520, "Trader Doni irawan ST", g_magic_440, 0, Blue);
}
}
}
}
if (OrdersTotalMagicSell(g_magic_448) > 0) {
for (g_pos_552 = 0; g_pos_552 < OrdersTotal(); g_pos_552++) {
OrderSelect(g_pos_552, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_448) {
g_ticket_696 = OrderTicket();
OrderSelect(g_ticket_696, SELECT_BY_TICKET, MODE_TRADES);
ld_208 += OrderLots();
g_ord_open_price_464 = OrderOpenPrice();
g_ord_lots_496 = OrderLots();
}
}
if (ld_208 + NormalizeDouble(g_ord_lots_496 * Multiplier, gd_632) < maxLot) {
if (StepMode == 0) {
if (Bid >= g_ord_open_price_464 + Step * Point && ls_144 == "true" && ls_152 == "true" && ls_168 == "true" && ls_176 == "true" && ls_192 == "false" && ls_96 == "true" &&
ls_112 == "true" && ls_184 == "false") {
g_ord_lots_480 = Multiplier * LotsSell * OrdersTotalMagicSell(g_magic_448);
if (TakeProfit > 0.0) g_price_528 = Bid - TakeProfit * Point;
else g_price_528 = 0;
if (StopLoss > 0.0) g_price_544 = Bid + StopLoss * Point;
else g_price_544 = 0;
RefreshRates();
g_ticket_696 = OrderSend(Symbol(), OP_SELL, NormalizeDouble(g_ord_lots_480, gd_632), Bid, 3, g_price_544, g_price_528, "Trader Doni irawan ST", g_magic_448, 0, Red);
}
}
if (StepMode == 1) {
if (Bid >= g_ord_open_price_464 + (Step + OrdersTotalMagicSell(g_magic_448) + OrdersTotalMagicSell(g_magic_448) - 2.0) * Point && ls_144 == "true" && ls_152 == "true" &&
ls_168 == "true" && ls_176 == "true" && ls_192 == "false" && ls_96 == "true" && ls_112 == "true" && ls_184 == "false") {
g_ord_lots_480 = Multiplier * LotsSell * OrdersTotalMagicSell(g_magic_448);
if (TakeProfit > 0.0) g_price_528 = Bid - TakeProfit * Point;
else g_price_528 = 0;
if (StopLoss > 0.0) g_price_544 = Bid + StopLoss * Point;
else g_price_544 = 0;
RefreshRates();
g_ticket_696 = OrderSend(Symbol(), OP_SELL, NormalizeDouble(g_ord_lots_480, gd_632), Bid, 3, g_price_544, g_price_520, "Trader Doni irawan ST", g_magic_448, 0, Red);
}
هذا هو
يجب أن تقوم بضبط باقي الكود حتى لا يعطي الإكسبرت أخطاءكود PHP:
int start() {
double ld_200;
double ld_208;
if (RiskMM) {
if (Risk < 0.1 || Risk > 100.0) {
Comment("Invalid Risk Value.");
return (0);
}
LotsBuy =AccountBalance()*Lot/(AccountBalance()-AccountProfit());
LotsSell = AccountBalance()*Lot/(AccountBalance()-AccountProfit());
}
if (RiskMM == FALSE) {
}
if (gd_672 != 0.0 && MinProfit > 0.0) {
if (gd_672 <= AccountBalance() && AccountBalance() <= gd_672 + MinProfit) Multiplier = 1;
else {
if (AccountBalance() < gd_672) {
}
}
}
gd_672 = AccountBalance();
double ld_0 = 0;
ld_0 = AccountEquity() - AccountBalance();
if (ld_0 < gd_684) gd_684 = ld_0;
string ls_8 = "false";
if (UseBasketLoss == TRUE && ld_0 <= (-1 * BasketLoss)) ls_8 = "true";
double ld_16 = 0;
double ld_24 = 0;
string l_symbol_32 = OrderSymbol();
double l_spread_40 = MarketInfo(l_symbol_32, MODE_SPREAD);
double l_digits_48 = MarketInfo(l_symbol_32, MODE_DIGITS);
double l_minlot_56 = MarketInfo(l_symbol_32, MODE_MINLOT);
double l_ima_64 = iMA(Symbol(), 0, MaPeriod, 0, MaMode, MaPrice, 1);
double l_istochastic_72 = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing, MODE_LWMA, 1, MODE_MAIN, 1);
double l_istochastic_80 = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing, MODE_LWMA, 1, MODE_SIGNAL, 1);
string ls_88 = "false";
string ls_96 = "false";
if (l_istochastic_72 > l_istochastic_80) ls_88 = "true";
if (l_istochastic_72 < l_istochastic_80) ls_96 = "true";
string ls_104 = "false";
string ls_112 = "false";
if (ExtendedZone == FALSE && l_istochastic_80 < SimpleZoneBuy) ls_104 = "true";
if (ExtendedZone == FALSE && l_istochastic_80 > SimpleZoneSell) ls_112 = "true";
if (ExtendedZone == TRUE && l_istochastic_80 > StartZoneBuy && l_istochastic_80 < EndZoneBuy) ls_104 = "true";
if (ExtendedZone == TRUE && l_istochastic_80 > StartZoneSell && l_istochastic_80 < EndZoneSell) ls_112 = "true";
string ls_120 = "false";
string ls_128 = "false";
if (ExtendedZone == TRUE && l_istochastic_80 <= CloseLevelDnSell || l_istochastic_80 >= CloseLevelUpSell) ls_120 = "true";
if (ExtendedZone == TRUE && l_istochastic_80 >= CloseLevelUpBuy || l_istochastic_80 <= CloseLevelDnBuy) ls_128 = "true";
string ls_136 = "false";
string ls_144 = "false";
if (Ask > l_ima_64 || MaFilter == FALSE) ls_136 = "true";
if (Bid < l_ima_64 || MaFilter == FALSE) ls_144 = "true";
string ls_152 = "false";
if (MaxSpread == MaxSpread || UseMaxSpread == FALSE) ls_152 = "true";
string ls_160 = "false";
string ls_168 = "false";
if (OrdersTotalMagicBuy(g_magic_440) < MaxBuyOrders || MaxOpenOrders == FALSE) ls_160 = "true";
if (OrdersTotalMagicSell(g_magic_448) < MaxSellOrders || MaxOpenOrders == FALSE) ls_168 = "true";
string ls_176 = "false";
if (AccountEquity() < EquityTarget || UseEquityTarget == FALSE) ls_176 = "true";
string ls_184 = "false";
if (TimeFilter == TRUE && !(Hour() < StartHour || Hour() >= EndHour)) ls_184 = "true";
string ls_192 = "false";
if (CloseFriday == TRUE && DayOfWeek() == 5 && TimeCurrent() >= StrToTime(CloseFridayHour + ":00")) ls_192 = "true";
if (l_minlot_56 == 0.01) {
gd_632 = 2;
if (maxLot <= 0.0) maxLot = MarketInfo(l_symbol_32, MODE_MAXLOT);
}
if (l_minlot_56 == 0.1) {
gd_632 = 1;
if (maxLot <= 0.0) maxLot = AccountBalance() / 2.0 / 1000.0;
}
if (OrdersTotalMagicBuy(g_magic_440) > 0) {
for (g_pos_552 = 0; g_pos_552 < OrdersTotal(); g_pos_552++) {
OrderSelect(g_pos_552, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_440) {
g_ticket_692 = OrderTicket();
OrderSelect(g_ticket_692, SELECT_BY_TICKET, MODE_TRADES);
ld_200 += OrderLots();
g_ord_open_price_456 = OrderOpenPrice();
g_ord_lots_488 = OrderLots();
}
}
if (ld_200 + NormalizeDouble(g_ord_lots_488 * Multiplier, gd_632) < maxLot) {
if (StepMode == 0) {
if (Ask <= g_ord_open_price_456 - Step * Point && ls_136 == "true" && ls_152 == "true" && ls_160 == "true" && ls_176 == "true" && ls_192 == "false" && ls_88 == "true" &&
ls_104 == "true" && ls_184 == "false") {
g_ord_lots_472 = Multiplier * LotsBuy * OrdersTotalMagicBuy(g_magic_440);
if (TakeProfit > 0.0) g_price_520 = Ask + TakeProfit * Point;
else g_price_520 = 0;
if (StopLoss > 0.0) g_price_536 = Ask - StopLoss * Point;
else g_price_536 = 0;
RefreshRates();
g_ticket_692 = OrderSend(Symbol(), OP_BUY, NormalizeDouble(g_ord_lots_472, gd_632), Ask, 3, g_price_536, g_price_520, "Trader Doni irawan ST", g_magic_440, 0, Blue);
}
}
if (StepMode == 1) {
if (Ask <= g_ord_open_price_456 - (Step + OrdersTotalMagicBuy(g_magic_440) + OrdersTotalMagicBuy(g_magic_440) - 2.0) * Point && ls_136 == "true" && ls_152 == "true" &&
ls_160 == "true" && ls_176 == "true" && ls_192 == "false" && ls_88 == "true" && ls_104 == "true" && ls_184 == "false") {
g_ord_lots_472 = Multiplier * LotsBuy * OrdersTotalMagicBuy(g_magic_440);
if (TakeProfit > 0.0) g_price_520 = Ask + TakeProfit * Point;
else g_price_520 = 0;
if (StopLoss > 0.0) g_price_536 = Ask - StopLoss * Point;
else g_price_536 = 0;
RefreshRates();
g_ticket_692 = OrderSend(Symbol(), OP_BUY, NormalizeDouble(g_ord_lots_472, gd_632), Ask, 3, g_price_536, g_price_520, "Trader Doni irawan ST", g_magic_440, 0, Blue);
}
}
}
}
if (OrdersTotalMagicSell(g_magic_448) > 0) {
for (g_pos_552 = 0; g_pos_552 < OrdersTotal(); g_pos_552++) {
OrderSelect(g_pos_552, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_448) {
g_ticket_696 = OrderTicket();
OrderSelect(g_ticket_696, SELECT_BY_TICKET, MODE_TRADES);
ld_208 += OrderLots();
g_ord_open_price_464 = OrderOpenPrice();
g_ord_lots_496 = OrderLots();
}
}
if (ld_208 + NormalizeDouble(g_ord_lots_496 * Multiplier, gd_632) < maxLot) {
if (StepMode == 0) {
if (Bid >= g_ord_open_price_464 + Step * Point && ls_144 == "true" && ls_152 == "true" && ls_168 == "true" && ls_176 == "true" && ls_192 == "false" && ls_96 == "true" &&
ls_112 == "true" && ls_184 == "false") {
g_ord_lots_480 = Multiplier * LotsSell * OrdersTotalMagicSell(g_magic_448);
if (TakeProfit > 0.0) g_price_528 = Bid - TakeProfit * Point;
else g_price_528 = 0;
if (StopLoss > 0.0) g_price_544 = Bid + StopLoss * Point;
else g_price_544 = 0;
RefreshRates();
g_ticket_696 = OrderSend(Symbol(), OP_SELL, NormalizeDouble(g_ord_lots_480, gd_632), Bid, 3, g_price_544, g_price_528, "Trader Doni irawan ST", g_magic_448, 0, Red);
}
}
if (StepMode == 1) {
if (Bid >= g_ord_open_price_464 + (Step + OrdersTotalMagicSell(g_magic_448) + OrdersTotalMagicSell(g_magic_448) - 2.0) * Point && ls_144 == "true" && ls_152 == "true" &&
ls_168 == "true" && ls_176 == "true" && ls_192 == "false" && ls_96 == "true" && ls_112 == "true" && ls_184 == "false") {
g_ord_lots_480 = Multiplier * LotsSell * OrdersTotalMagicSell(g_magic_448);
if (TakeProfit > 0.0) g_price_528 = Bid - TakeProfit * Point;
else g_price_528 = 0;
if (StopLoss > 0.0) g_price_544 = Bid + StopLoss * Point;
else g_price_544 = 0;
RefreshRates();
g_ticket_696 = OrderSend(Symbol(), OP_SELL, NormalizeDouble(g_ord_lots_480, gd_632), Bid, 3, g_price_544, g_price_520, "Trader Doni irawan ST", g_magic_448, 0, Red);
}
شكرا جزيلا لك الاخ MR.dollar على حبك لمساعدة اخوانك اتمنى من الله عز و جل جلاله ان يرزقك بالخير
ان شاء الله ويجعله في ميزان حسناتك
لقد قمت بتركيب الكود على الاكسبيرت و عملت تصحيح للاخطاء التي ظهرت
على ما اعتقد ان التصحيح غير كافي لكي يعمل الاكسبيرت كما خطط له
يعني نادرا ما يقوم بتطبيق هده المعادل
و المخطط له هو ان يقوم بتطبيق هده المعادل كل ما تغير البالنس بالموجب او بالسالب
من الافضل ان يقوم بحساب الناتج برقمين بعد الفاصلة عند تطبيق هده المعادلة
على كل حال لقد قمت بفتح موضوع خاص لهدا لالكسبيرت على هده الرابط ارجو ان تطلع عليه
https://forum.arabictrader.com/t137245.html
السلام عليكم ورحمة الله
أستاذ أسامة :eh_s(7):
هذا الكود لمؤشر TSR Signal Line
https://lh6.googleusercontent.com/-J...E/s529/tsr.png
أردت أن أفهم كيف يشتغلكود PHP:
//+------------------------------------------------------------------+
//| HMA.mq4
//| Copyright © 2006 WizardSerg <[email protected]>, ?? ??????? ForexMagazine #104
//| [email protected]
//| Revised by IgorAD,[email protected] |
//|
//| Personalized by iGoR AKA FXiGoR for the Trend Slope Trading method (T_S_T)
//| Link:
//| contact: [email protected]
//+------------------------------------------------------------------+
#property copyright "MT4 release WizardSerg <[email protected]>, ?? ??????? ForexMagazine #104"
#property link "[email protected]"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
//---- input parameters
extern int period=15;
extern int method=3; // MODE_SMA
extern int price=0; // PRICE_CLOSE
//---- buffers
double Uptrend[];
double Dntrend[];
double ExtMapBuffer[];
double prevtrend;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(3);
SetIndexBuffer(0, Uptrend);
//ArraySetAsSeries(Uptrend, true);
SetIndexBuffer(1, Dntrend);
//ArraySetAsSeries(Dntrend, true);
SetIndexBuffer(2, ExtMapBuffer);
ArraySetAsSeries(ExtMapBuffer, true);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,4);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,4);
IndicatorShortName("Execute Line("+period+")");
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
// ???? ????? ?????? ??????
return(0);
}
//+------------------------------------------------------------------+
//| ?????????? ??????? |
//+------------------------------------------------------------------+
double WMA(int x, int p)
{
return(iMA(NULL, 0, p, 0, method, price, x));
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars = IndicatorCounted();
if(counted_bars < 0)
return(-1);
int x = 0;
int p = MathSqrt(period);
int e = Bars - counted_bars + period + 1;
double vect[], trend[];
if(e > Bars)
e = Bars;
ArrayResize(vect, e);
ArraySetAsSeries(vect, true);
ArrayResize(trend, e);
ArraySetAsSeries(trend, true);
for(x = 0; x < e; x++)
{
vect[x] = 2*WMA(x, period/2) - WMA(x, period);
// Print("Bar date/time: ", TimeToStr(Time[x]), " close: ", Close[x], " vect[", x, "] = ", vect[x], " 2*WMA(p/2) = ", 2*WMA(x, period/2), " WMA(p) = ", WMA(x, period));
}
for(x = 0; x < e-period; x++)
ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, method, x);
for(x = e-period; x >= 0; x--)
{
trend[x] = trend[x+1];
if (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;
if (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;
if (trend[x]>0)
{ Uptrend[x] = ExtMapBuffer[x];
if (trend[x+1]<0) {Uptrend[x+1]=ExtMapBuffer[x+1];
}
Dntrend[x] = EMPTY_VALUE;
}
else
if (trend[x]<0)
{
Dntrend[x] = ExtMapBuffer[x];
if (trend[x+1]>0) {Dntrend[x+1]=ExtMapBuffer[x+1];}
Uptrend[x] = EMPTY_VALUE;
}
//Print( " trend=",trend[x]);
//Comment(Dntrend[1]+" "+Dntrend[2]+" "+Uptrend[1]+" "+Uptrend[2]);
if (x==0){
if ((trend[1]*prevtrend)<0){Alert("TSR change");}
prevtrend=trend[1];
}
}
return(0);
}
//+------------------------------------------------------------------+
الجزء البدائي مفهوم جيدا
ماعداكود PHP:
#property copyright "MT4 release WizardSerg <[email protected]>, ?? ??????? ForexMagazine #104"
#property link "[email protected]"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
//---- input parameters
extern int period=15;
extern int method=3; // MODE_SMA
extern int price=0; // PRICE_CLOSE
//---- buffers
double Uptrend[];
double Dntrend[];
double ExtMapBuffer[];
double prevtrend;
لم أفهم دورهما :Emoticon1:كود PHP:
double ExtMapBuffer[];
double prevtrend;
ثم في جزء int init
حسب ما أعرف هو الجزء المسؤل على ما يظهر في الشارتكود PHP:
int init()
{
IndicatorBuffers(3);
SetIndexBuffer(0, Uptrend);
//ArraySetAsSeries(Uptrend, true);
SetIndexBuffer(1, Dntrend);
//ArraySetAsSeries(Dntrend, true);
SetIndexBuffer(2, ExtMapBuffer);
ArraySetAsSeries(ExtMapBuffer, true);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,4);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,4);
IndicatorShortName("Execute Line("+period+")");
return(0);
}
المؤشر يعطي Uptrend بلون أخضر و Dntrend بلون أحمر
لاكن ما دور
ثم جزء int deinitكود PHP:
SetIndexBuffer(2, ExtMapBuffer);
ArraySetAsSeries(ExtMapBuffer, true);
حسب ما اعرف يقوم بوظيفته عند نزع المؤشر من الشارت
مذا يقصد هذا السطركود PHP:
int deinit()
{
// ???? ????? ?????? ??????
return(0);
}
//+------------------------------------------------------------------+
//| ?????????? ??????? |
//+------------------------------------------------------------------+
double WMA(int x, int p)
{
return(iMA(NULL, 0, p, 0, method, price, x));
}
ثم جزء int start :yikes3:كود PHP:
return(iMA(NULL, 0, p, 0, method, price, x));
هذا مفهومكود PHP:
int start()
{
int counted_bars = IndicatorCounted();
if(counted_bars < 0)
return(-1);
int x = 0;
int p = MathSqrt(period);
int e = Bars - counted_bars + period + 1;
double vect[], trend[];
if(e > Bars)
e = Bars;
ArrayResize(vect, e);
ArraySetAsSeries(vect, true);
ArrayResize(trend, e);
ArraySetAsSeries(trend, true);
for(x = 0; x < e; x++)
{
vect[x] = 2*WMA(x, period/2) - WMA(x, period);
// Print("Bar date/time: ", TimeToStr(Time[x]), " close: ", Close[x], " vect[", x, "] = ", vect[x], " 2*WMA(p/2) = ", 2*WMA(x, period/2), " WMA(p) = ", WMA(x, period));
}
for(x = 0; x < e-period; x++)
ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, method, x);
for(x = e-period; x >= 0; x--)
{
trend[x] = trend[x+1];
if (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;
if (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;
if (trend[x]>0)
{ Uptrend[x] = ExtMapBuffer[x];
if (trend[x+1]<0) {Uptrend[x+1]=ExtMapBuffer[x+1];
}
Dntrend[x] = EMPTY_VALUE;
}
else
if (trend[x]<0)
{
Dntrend[x] = ExtMapBuffer[x];
if (trend[x+1]>0) {Dntrend[x+1]=ExtMapBuffer[x+1];}
Uptrend[x] = EMPTY_VALUE;
}
//Print( " trend=",trend[x]);
//Comment(Dntrend[1]+" "+Dntrend[2]+" "+Uptrend[1]+" "+Uptrend[2]);
if (x==0){
if ((trend[1]*prevtrend)<0){Alert("TSR change");}
prevtrend=trend[1];
}
}
return(0);
}
لماذا عرف هذه المتغيرات بهذه الطريقةكود PHP:
int counted_bars = IndicatorCounted();
if(counted_bars < 0)
return(-1);
و لماذا هذاكود PHP:
int x = 0;
int p = MathSqrt(period);
int e = Bars - counted_bars + period + 1;
ثم هنا ما دور ArrayResize و ArraySetAsSeriesكود PHP:
if(e > Bars)
e = Bars;
ثم هناك 3 حلقات for يتطلب فهمها فهم ما قبلها طبعاكود PHP:
ArrayResize(vect, e);
ArraySetAsSeries(vect, true);
ArrayResize(trend, e);
ArraySetAsSeries(trend, true);
أرجو من فضلك توضيح ما سبق وجزاك الله خيرا :eh_s(7):
حتى تستطيع فهم الفائده من إضافة متغير أو داله في الكود فيجب أن تراجع أجزاء الكود بشكل كامل وتراجع القيم التي يأخذها هذا المتغير والأماكن التي توضع فيه
فمثلا بالنسبه للجزء الأول
المتغير ExtMapBuffer يأخذ قيمة المصفوفهكود PHP:
double ExtMapBuffer[];
double prevtrend;
ثم تبدأ المقارنهكود PHP:
ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, method, x);
فإذا كانت قيمة ExtMapBuffer والتي عرفنا من أين تأخذ قيمتها للشمعه الحاليه أكبر من الشمعه السابقهكود PHP:
if (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;
if (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;
يصبح trend=1 وإذا كانت أقل يصبح trend=-1
لماذا شرحت هذا الجزء
لأنه مرتبط بالمتغير الآخر prevtrend
والذي سوف تجده في جزء التنبيه
فمثلا إذا كانت قيمة trend=1 فهو يأخذ قيمتين إما 1 أو -1 كما رأيت في الجزء السابقه فإذا كانت قيمته 1 أي أن الترند صاعد وقيمة prevtrend = -1 فسوف يصبح الناتج trend[1]*prevtrend=1*-1=-1كود PHP:
if ((trend[1]*prevtrend)<0){Alert("TSR change");}
prevtrend=trend[1];
فيتم التنبيه
ثم تصبح قيمة prevtrend=1
بعد ذلك عند تغير لون المؤشر مره أخرى فيصبح ترند هابط فيكون قيمة trend=-1 وسابقا أصبحت
قيمة prevtrend=1 فأيضا يكون الناتج -1*1 < 0 فيتم التنبيه
أي أن هذا المتغير مرتبط بالتنبيه بحيث يكون التنبيه فقط في كل مره يتغير لون المؤشر
الجزء الآخر
المفروض أنك تعرف الدوال الخارجيه وكيفية عمل داله لإستدعائها لاحقا بداخل الداله startكود PHP:
double WMA(int x, int p)
{
return(iMA(NULL, 0, p, 0, method, price, x));
}
الأمر return يقوم بحفظ قيمة الداله بحيث في كل مره تقوم بإستدعائها تعود بهذه القيمه كأبسط مثال
هذه الداله قمت بعملها بحيث يحسب قيمة 5+3 ثم يحفظها بإستخدام الأمر returnكود PHP:
double Number()
{
double a=5+3;
return(a);
}
ففي كل مره سأقوم بإستدعاء الداله
سوف تصبح قيمتها 5+3=8كود PHP:
Number()
لكن إذا جعلتها بهذا الشكل
فإذا قمت بإستدعائها لن تأخذ أي قيمة لأنني لم أطلب منه أن يحفظ قيمة الناتجكود PHP:
double Number()
{
a=5+3;
}
الجزء الآخر
قام بتعريف المتغير x لإستخدامه لاحقا في الحلقهكود PHP:
int x = 0;
int p = MathSqrt(period);
int e = Bars - counted_bars + period + 1;
فيمكنك إما تعريفه خارج الحلقه كما فعل هو أو داخل الحلقهكود PHP:
for(x = 0; x < e; x++)
لا يوجد إختلافكود PHP:
for(int x = 0; x < e; x++)
الجزء الآخير في المشاركه القادمه
العفو أخي الكريم
الجزء الثاني
المتغير p قام بتعريفه وأعطاه القيمه جزء المتغير period وهو المتغير الخارجي الذي تقوم بتحديده في إعدادات المؤشركود PHP:
int p = MathSqrt(period);
وإستخدمه لاحقا في حساب قيمة الموفينج
بمناسبة ذكر iMAOnArray فهو تقوم بحساب الموفينج أفريج لمصفوفه معينهكود PHP:
ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, method, x);
فمثلا الموفينج العادي يقوم بحساب الموفينج أفريج لإغلاق 14 شمعه كمثال
لكن الداله iMAOnArray تقوم بحساب الموفينج أفريج للمصفوفه التي يتم تحديدها مثلا حساب موفينج أفريج لآخر 14 قمه أو حساب موفينج أفريج لمؤشر الآر إس آي وهكذا
لكن في هذا المؤشر فيقوم بحساب الموفينج أفريج للمصفوفه vect
وهي تأخذ القيمه من الكود الآتي
لاحظ أن الداله WMA هي التي تكلمنا عنها سابقا في المشاركه السابقهكود PHP:
vect[x] = 2*WMA(x, period/2) - WMA(x, period);
قام بتعريف المتغير e وأعطاه القيمة عدد الشموع - عدد الشموع التي تم عدها منذ آخر مره تم وضع المؤشر على الشارت + قيمة المتغير الخارجي period +1كود PHP:
int e = Bars - counted_bars + period + 1;
وغالبا نحن نستخدم هذه المعادله في المؤشرات حتى تنجنب حساب قيمة المؤشر لجميع الشموع في كل مره يتحرك السعر حتى لا يكون المؤشر بطيء
مثلا عدد الشموع على الشارت هي 500 شمعه وعدد الشموع التي تم عدها منذ تم وضع المؤشر على الشارت هي 500 أيضا أي أنه لم تتكون شمعه جديده بعد
الآن تكونت شمعه جديده
فأصبحت عدد الشموع 501 وعدد الشموع التي تم عدها هي 500 فيصبح الناتج 501-500 +period + 1
لنفرض أن period=15 وهو المتغير الخارجي الذي يتم تحديده في خصائص المؤشر
فيصبح الناتج 501 -500 + 15 + 1 = 16 شمعه ويقوم بإستخدامها في هذه الحلقه
الجزء الآخركود PHP:
for(int x = 0; x < e; x++)
وهو مرتبط إلى حد كبير بالجزء السابقكود PHP:
if(e > Bars)
e = Bars;
فلنفرض مثلا أن عدد الشموع على الشارت 500 وعدد الشموع التي تم عدها هي 0 أي أن المؤشر تم وضعه على الشارت الآن وسيبدأ بحساباته لأول مره
فسوف تصبح قيمة e= 500 - 0 + 15 + 1
فيكون الناتج 516 لكن عدد الشموع على الشارت أساسا 500 فقط فسوف يحدث خطأ في الحسابات بناء على الحلقه
لذلك وضع هذا الشرط بحيث إذا كانت قيمة e أكبر من عدد الشموع فإنه يجعلقيمة e هي عدد الشموع الكليكود PHP:
for(int x = 0; x < e; x++)
الجزء الأخير
هذه الداله تقوم بوضع حجم جديد للمصفوفه فمثلا كما تعلم أنا أريد عمل مصفوفه يوضع بها 30 عنصر أو 15 عنصر فأكتبهاكود PHP:
ArrayResize
لكن لنفرض أني لا أعرف عدد قيم المصفوفه فيمكنني تعريفها بدون وضع حد للعناصر بهاكود PHP:
double array1[30];
double array2[15];
ثم يمكنني بإستخدام الداله ArrayResize أن أحدد عدد العناصر بها في أي وقتكود PHP:
double array1[];
double array2[];
وهذا ما فعله في هذه المصفوفاتكود PHP:
ArrayResize(array1,30);
ArrayResize(array2,15);
فبعد أن عرف عدد الشموع e قام بتحديد المصفوفتين vect و trend بعدد هذه الشموع لأنها لن تأخذ أكثر من هذه القيمكود PHP:
ArrayResize(vect, e); ArrayResize(trend, e);
أما
فهي تقوم بعكس قيمة المصفوفهكود PHP:
ArraySetAsSeries
فمثلا إذا كانت قيمة المصفوفه array1
للشمعه 0 = 14
وللشمعه 1 = 20
وللشمعه 2 = 50
وللشمعه 3 = 120
فعندما أجعل
فسوف تصبح قيمةكود PHP:
ArraySetAsSeries(array1,true);
الشمعه 0 = 120
الشمعه 1 = 50
الشمعه 2 = 20
الشمعه 3 = 14
بارك الله فيك أستاذ أسامة :eh_s(7):
شرحت لي
وقلت بأن دوره عكس قيمة المصفوفة لاكن ما الهدف من عكس قيم المصفوفتين vect و trend في المؤشركود PHP:
ArraySetAsSeries
وهناك أيضا فوق في الجزء الأول
عكس قيمة هذه المصفوفة ولاكن لماذا؟ ولو وضعنا false مكان true مذا سيحصل :016:كود PHP:
ArraySetAsSeries(ExtMapBuffer, true);
وسؤال أخر من فضلك
وهنا أنا فهمت المبدأ مثل ما شرحت لي لاكن لا توجد إشارة تساوي (=) يعني ما هي قيمة wma بالضبط ؟كود PHP:
double WMA(int x, int p)
{
return(iMA(NULL, 0, p, 0, method, price, x));
}
أرجو أن لا تكون أسئلتي غبية :doh:
وشكرا جزيلااااااااااااا :eh_s(7):
لكل مبرمج طريقته في كتابة الكود وأنصحك إذا وجدت صعوبه في بعض الأكواد جرب تغييرها وتابع النتيجه وما هي التغييرات التي حدثت
هو إستخدم عكس المصفوفه حتى تناسب الكود مثلا في هذا الجزء
فالطبيعي إذا راجعت هذه المقارنه بدون عكس الكود فهذا يعني إذا كانت قيمة ExtMapBuffer للشمعه الحاليه أكبر من الشمعه السابقه أو قيمة ExtMapBuffer الشمعه الحاليه أصغر من الشمعه السابقهكود PHP:
if (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;
if (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;
لكن عند إستخدام عكس المصفوفه فسوف يعني
إذا كان قيمة ExtMapBuffer للشمعه الحاليه أكبر من الشمعه التاليه وليس والسابقه
إذا جعلت false بدل true فهذا يعني عدم عكس المصفوفه حاول تجربتها
الجزء الثاني
هذا الكود
هو نفسه لو قمت بعمله على جزئينكود PHP:
double WMA(int x, int p)
{
return(iMA(NULL, 0, p, 0, method, price, x));
}
وهذاكود PHP:
double WMA(int x, int p)
{
double ma=iMA(NULL, 0, p, 0, method, price, x);
return(ma);
}
هو نفسه هذاكود PHP:
double Number()
{
double a=5+3;
return(a);
}
كود PHP:
double Number()
{
return(5+3);
}
اخي ماستر دولار
اريد ان اجعل الاكسبيرت يعمل على ازواج مختلفة لكن ادا وجد تحقق شروط الصفقة
يقسم المخاطرة على الازواج المحققة للشروط
السلام عليكم ورحمة الله
الأخ العزيز أستاذ أسامه جزاك الله خيرا على ما تقدمه ,,,
أنا أحاول أخي تعلم البرمجه وقرأت بعض الموضوعات هنا وهناك و أريدك لو تنصحني ببعض الكتب لتعلم البرمجه من البدايه تكون عندي كمراجع و أريد ملف به أكواد المؤشرات و به المرادفات البرمجيه للكلمات مثل أو ,, و ,, يساوي ,,,, و هكذا إن إمكن ,
أنا قمت ببرمجة إكسبيرت يعتمد على مؤشر الإيشيموكو من المفترض أن يقوم بعمل الآتي :
يفتح صفقة بيع عند كسر السعر لسحابة الكوموسبان لأسفل بشرط خروج خط التنكن سن أيضا من الكوموسبان و يكون خط الشينكوسبان أسفل السعر ,,, و العكس في الشراء ,
الإكسبيرت رقم ١ مفترض أن يعمل على المنصات الرباعيه و الخماسيه لكنه لا يفتح على المنصه نهائيا , أي لا يعمل و جربته على أكثر من منصه عندي .
الإكسبيرت رقم ٢ برمجته بمساعدة برنامج يصنع الإكسبيرت ويتم وضع شرط البيع و الشراء وهو يقوم بالباقي و هذا البرنامج موجود بموضع إصنع إكسبيرتك بنفسك للأخ ram22 و هذا يعمل عند وضعه على أي منصه لكنه لا يفتح صفقات بنفس الطريقه و قد لا يفتح صفقات ,,,
رجاء الإطلاع على الإكسبيرتين و إخباري بالخطأ ,
وشكرا جزيلا