Ahmad barghouth

MQL5 Indicators Experts

Specification

kguyfytd hdgytif ftiloyesytfjkg fugugy //+------------------------------------------------------------------+
//|                    Gold_Grid_EA_v5.mq5                           |
//|            Grid Bot – XAUUSD – AHMAD BARGHOUTH                   |
//|  v5: Trailing 50 نقطة ثابتة يلحق السعر + نجوم كلمة السر         |
//+------------------------------------------------------------------+
#property copyright "AHMAD BARGHOUTH"
#property version   "5.00"
#property strict

#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>

CTrade        trade;
CPositionInfo posInfo;

//--- Inputs
input string  InpPassword       = "";           // كلمة السر (اكتبها هنا)
input double  InpLotSize        = 0.01;
input int     InpGridPoints     = 45;           // نقاط بين الصفقات
input int     InpStartOffset    = 90;           // نقاط بين أول BUY وأول SELL
input int     InpBuyCount       = 10;
input int     InpSellCount      = 10;
// TP = سعر الصفقة الخامسة = 4 × GridPoints  (يُحسب تلقائياً)
input int     InpSLPoints       = 2000;         // Stop Loss احتياطي
input int     InpTrailingPoints = 50;           // مسافة Trailing بالنقاط (ثابتة)
input int     InpTrailingStep   = 10;           // خطوة تحريك SL (نقاط) — يمنع التعديل على كل تيك
input int     InpMaxStopLosses  = 3;            // عدد الستوبات قبل الريست
input int     InpStartHour      = 9;
input int     InpEndHour        = 20;
input double  InpMaxDailyLoss   = 500.0;
input ulong   InpMagicNumber    = 303030;
input bool    InpCloseAll       = false;

//--- Globals
double   point;
int      digits;
bool     isUnlocked      = false;
bool     gridOpened      = false;
double   dayStartBalance = 0;
datetime lastDay         = 0;
int      stopLossCount   = 0;
int      totalPositions  = 0;
datetime lastResetTime   = 0;

//--- Object Names
#define OBJ_BG         "AB_Background"
#define OBJ_GOLD1      "AB_GoldBar1"
#define OBJ_GOLD2      "AB_GoldBar2"
#define OBJ_TITLE      "AB_Title"
#define OBJ_NAME       "AB_Name"
#define OBJ_LOCK       "AB_LockIcon"
#define OBJ_MSG        "AB_Message"
#define OBJ_WATERMARK  "AB_Watermark"
#define OBJ_STATUS     "AB_Status"
#define OBJ_STATUS2    "AB_Status2"
#define OBJ_DIVIDER    "AB_Divider"

//+------------------------------------------------------------------+
//|  TP يساوي سعر الصفقة الخامسة = 4 × GridPoints                   |
//+------------------------------------------------------------------+
double CalcTPPoints()
{
   return InpGridPoints * 4.0;
}

//+------------------------------------------------------------------+
int OnInit()
{
   if(StringFind(_Symbol, "XAU") < 0 && _Symbol != "GOLD")
   {
      Alert("البوت مخصص للذهب فقط! الرمز: ", _Symbol);
      return INIT_FAILED;
   }

   trade.SetExpertMagicNumber(InpMagicNumber);
   trade.SetDeviationInPoints(50);
   trade.SetTypeFilling(ORDER_FILLING_RETURN);

   point  = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
   digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);

   dayStartBalance = AccountInfoDouble(ACCOUNT_BALANCE);
   lastDay         = TimeCurrent();

   DrawLoginScreen();

   if(InpPassword == "k2ahmadk2@AA")
   {
      isUnlocked = true;
      DrawUnlockedScreen();

      if(InpCloseAll)
      {
         CloseAll();
         ExpertRemove();
         return INIT_SUCCEEDED;
      }

      if(CountPositions() == 0 && CountOrders() == 0)
         OpenGrid();
      else
      {
         totalPositions = CountPositions();
         gridOpened     = true;
         Print("صفقات مسبقة موجودة: ", totalPositions);
      }
   }
   else if(InpPassword != "")
   {
      DrawWrongPassword();
      Print("❌ كلمة السر خاطئة!");
   }
   else
   {
      Print("⏳ في انتظار كلمة السر...");
   }

   return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
void OnTick()
{
   if(!isUnlocked) return;
   if(!CheckDailyLoss()) return;

   MqlDateTime dt;
   TimeToStruct(TimeCurrent(), dt);
   if(dt.hour < InpStartHour || dt.hour >= InpEndHour) return;

   CheckStopLossReset();

   // Trailing يشتغل على كل صفقة مفتوحة فوراً من أول تيك
   TrailingStop();

   UpdateStatus();
}

//+------------------------------------------------------------------+
//|  فحص الستوبات وإعادة فتح الشبكة                                 |
//+------------------------------------------------------------------+
void CheckStopLossReset()
{
   int currentPositions = CountPositions();

   if(gridOpened && currentPositions < totalPositions && totalPositions > 0)
   {
      int closedNow  = totalPositions - currentPositions;
      stopLossCount += closedNow;

      Print("⚠️ صفقة أُغلقت! عداد: ", stopLossCount, "/", InpMaxStopLosses);
      totalPositions = currentPositions;

      if(stopLossCount >= InpMaxStopLosses)
      {
         if(TimeCurrent() - lastResetTime < 5) return;

         Print("🔄 ", InpMaxStopLosses, " ستوبات → إعادة فتح الشبكة...");

         CloseAll();

         stopLossCount  = 0;
         totalPositions = 0;
         gridOpened     = false;
         lastResetTime  = TimeCurrent();

         OpenGrid();
         Print("✅ تمت إعادة فتح الشبكة");
      }
   }

   if(gridOpened && totalPositions == 0 && currentPositions > 0)
      totalPositions = currentPositions;
}

//+------------------------------------------------------------------+
//|  Trailing Stop ثابت 50 نقطة — يلحق السعر من أول تيك             |
//|  BUY  → SL يلحق من تحت السعر بـ 50 نقطة (يطلع مع السعر)        |
//|  SELL → SL يلحق من فوق السعر بـ 50 نقطة (ينزل مع السعر)        |
//+------------------------------------------------------------------+
void TrailingStop()
{
   // مسافة الـ Trailing بالسعر
   double trailing = InpTrailingPoints * point;
   // أقل خطوة تحريك للـ SL (نمنع التعديل المستمر على كل تيك)
   double step     = InpTrailingStep * point;

   for(int i = 0; i < PositionsTotal(); i++)
   {
      if(!posInfo.SelectByIndex(i))          continue;
      if(posInfo.Magic()  != InpMagicNumber) continue;
      if(posInfo.Symbol() != _Symbol)        continue;

      double currentSL = posInfo.StopLoss();
      double currentTP = posInfo.TakeProfit();

      if(posInfo.PositionType() == POSITION_TYPE_BUY)
      {
         double bid   = SymbolInfoDouble(_Symbol, SYMBOL_BID);
         // SL الجديد = السعر الحالي - 50 نقطة (يلحق السعر للأعلى)
         double newSL = NormalizeDouble(bid - trailing, digits);

         // يتحرك فقط لو SL الجديد أعلى من القديم بمقدار الخطوة
         if(newSL > 0 && (currentSL < 1.0 || newSL >= currentSL + step))
         {
            if(trade.PositionModify(posInfo.Ticket(), newSL, currentTP))
               Print("📈 BUY Trailing #", posInfo.Ticket(),
                     " | BID=", DoubleToString(bid, digits),
                     " | SL → ", DoubleToString(newSL, digits));
         }
      }
      else if(posInfo.PositionType() == POSITION_TYPE_SELL)
      {
         double ask   = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         // SL الجديد = السعر الحالي + 50 نقطة (يلحق السعر للأسفل)
         double newSL = NormalizeDouble(ask + trailing, digits);

         // يتحرك فقط لو SL الجديد أقل من القديم بمقدار الخطوة
         if(newSL > 0 && (currentSL < 1.0 || newSL <= currentSL - step))
         {
            if(trade.PositionModify(posInfo.Ticket(), newSL, currentTP))
               Print("📉 SELL Trailing #", posInfo.Ticket(),
                     " | ASK=", DoubleToString(ask, digits),
                     " | SL → ", DoubleToString(newSL, digits));
         }
      }
   }
}

//+------------------------------------------------------------------+
//|  فتح الشبكة                                                      |
//|  TP = سعر الصفقة الخامسة (4 × GridPoints)                       |
//+------------------------------------------------------------------+
void OpenGrid()
{
   double ask    = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double bid    = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double gap    = InpGridPoints  * point;
   double offset = InpStartOffset * point;
   double sl_pts = InpSLPoints    * point;

   // TP = 4 فراغات شبكة = مسافة من صفقة 1 لصفقة 5
   double tpPts  = CalcTPPoints() * point;

   int buyOK = 0, sellOK = 0;

   for(int i = 0; i < InpBuyCount; i++)
   {
      double entry = NormalizeDouble(ask + offset + i * gap, digits);
      double tp    = NormalizeDouble(entry + tpPts, digits);
      double sl    = NormalizeDouble(entry - sl_pts, digits);

      if(trade.BuyStop(InpLotSize, entry, _Symbol, sl, tp,
                       ORDER_TIME_GTC, 0, "GGRID_BUY_" + IntegerToString(i + 1)))
         buyOK++;
   }

   for(int i = 0; i < InpSellCount; i++)
   {
      double entry = NormalizeDouble(bid - offset - i * gap, digits);
      double tp    = NormalizeDouble(entry - tpPts, digits);
      double sl    = NormalizeDouble(entry + sl_pts, digits);

      if(trade.SellStop(InpLotSize, entry, _Symbol, sl, tp,
                        ORDER_TIME_GTC, 0, "GGRID_SELL_" + IntegerToString(i + 1)))
         sellOK++;
   }

   gridOpened     = true;
   totalPositions = 0;

   Print("✅ الشبكة جاهزة | BUY: ", buyOK, " | SELL: ", sellOK,
         " | TP=", DoubleToString(tpPts / point, 0), " نقطة (صفقة 5)",
         " | Trailing=", InpTrailingPoints, " نقطة",
         " | Grid=", InpGridPoints, " | Offset=", InpStartOffset);
}

//+------------------------------------------------------------------+
void UpdateStatus()
{
   static datetime lastUpdate = 0;
   if(TimeCurrent() - lastUpdate < 5) return;
   lastUpdate = TimeCurrent();

   string statusText = StringFormat(
      "🟢  EA Active | Positions: %d | SL Count: %d/%d | Trailing: %d pts | TP: %d pts",
      CountPositions(), stopLossCount, InpMaxStopLosses,
      InpTrailingPoints, (int)CalcTPPoints()
   );

   ObjectSetString(0, OBJ_STATUS, OBJPROP_TEXT, statusText);
   ChartRedraw(0);
}

//+------------------------------------------------------------------+
bool CheckDailyLoss()
{
   MqlDateTime now, last;
   TimeToStruct(TimeCurrent(), now);
   TimeToStruct(lastDay, last);

   if(now.day != last.day)
   {
      dayStartBalance = AccountInfoDouble(ACCOUNT_BALANCE);
      lastDay         = TimeCurrent();
      stopLossCount   = 0;
      Print("📅 يوم جديد - تم إعادة ضبط العداد");
   }

   double currentBalance = AccountInfoDouble(ACCOUNT_BALANCE);
   double dailyLoss      = dayStartBalance - currentBalance;

   if(dailyLoss >= InpMaxDailyLoss)
   {
      Print("🛑 الحد اليومي للخسارة: $", DoubleToString(dailyLoss, 2));
      ObjectSetString (0, OBJ_STATUS, OBJPROP_TEXT,
         "🔴  STOPPED | Daily Loss: $" + DoubleToString(dailyLoss, 2));
      ObjectSetInteger(0, OBJ_STATUS, OBJPROP_COLOR, clrRed);
      ChartRedraw(0);
      CloseAll();
      return false;
   }

   return true;
}

//+------------------------------------------------------------------+
//|  شاشة Login مع نجوم كلمة السر على الشاشة                        |
//+------------------------------------------------------------------+
void DrawLoginScreen()
{
   int chartW = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS);
   int chartH = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS);

   // خلفية
   ObjectCreate(0, OBJ_BG, OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, OBJ_BG, OBJPROP_XDISTANCE,   0);
   ObjectSetInteger(0, OBJ_BG, OBJPROP_YDISTANCE,   0);
   ObjectSetInteger(0, OBJ_BG, OBJPROP_XSIZE,       chartW);
   ObjectSetInteger(0, OBJ_BG, OBJPROP_YSIZE,       chartH);
   ObjectSetInteger(0, OBJ_BG, OBJPROP_BGCOLOR,     C'10,10,20');
   ObjectSetInteger(0, OBJ_BG, OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(0, OBJ_BG, OBJPROP_COLOR,       C'10,10,20');
   ObjectSetInteger(0, OBJ_BG, OBJPROP_BACK,        false);
   ObjectSetInteger(0, OBJ_BG, OBJPROP_ZORDER,      0);

   // شريط ذهبي علوي
   ObjectCreate(0, OBJ_GOLD1, OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, OBJ_GOLD1, OBJPROP_XDISTANCE,   0);
   ObjectSetInteger(0, OBJ_GOLD1, OBJPROP_YDISTANCE,   0);
   ObjectSetInteger(0, OBJ_GOLD1, OBJPROP_XSIZE,       chartW);
   ObjectSetInteger(0, OBJ_GOLD1, OBJPROP_YSIZE,       8);
   ObjectSetInteger(0, OBJ_GOLD1, OBJPROP_BGCOLOR,     C'212,175,55');
   ObjectSetInteger(0, OBJ_GOLD1, OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(0, OBJ_GOLD1, OBJPROP_COLOR,       C'212,175,55');
   ObjectSetInteger(0, OBJ_GOLD1, OBJPROP_BACK,        false);
   ObjectSetInteger(0, OBJ_GOLD1, OBJPROP_ZORDER,      1);

   // شريط ذهبي سفلي
   ObjectCreate(0, OBJ_GOLD2, OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, OBJ_GOLD2, OBJPROP_XDISTANCE,   0);
   ObjectSetInteger(0, OBJ_GOLD2, OBJPROP_YDISTANCE,   chartH - 8);
   ObjectSetInteger(0, OBJ_GOLD2, OBJPROP_XSIZE,       chartW);
   ObjectSetInteger(0, OBJ_GOLD2, OBJPROP_YSIZE,       8);
   ObjectSetInteger(0, OBJ_GOLD2, OBJPROP_BGCOLOR,     C'212,175,55');
   ObjectSetInteger(0, OBJ_GOLD2, OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(0, OBJ_GOLD2, OBJPROP_COLOR,       C'212,175,55');
   ObjectSetInteger(0, OBJ_GOLD2, OBJPROP_BACK,        false);
   ObjectSetInteger(0, OBJ_GOLD2, OBJPROP_ZORDER,      1);

   // خط فاصل ذهبي
   ObjectCreate(0, OBJ_DIVIDER, OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, OBJ_DIVIDER, OBJPROP_XDISTANCE,   chartW/2 - 150);
   ObjectSetInteger(0, OBJ_DIVIDER, OBJPROP_YDISTANCE,   chartH/2 - 10);
   ObjectSetInteger(0, OBJ_DIVIDER, OBJPROP_XSIZE,       300);
   ObjectSetInteger(0, OBJ_DIVIDER, OBJPROP_YSIZE,       2);
   ObjectSetInteger(0, OBJ_DIVIDER, OBJPROP_BGCOLOR,     C'212,175,55');
   ObjectSetInteger(0, OBJ_DIVIDER, OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(0, OBJ_DIVIDER, OBJPROP_COLOR,       C'212,175,55');
   ObjectSetInteger(0, OBJ_DIVIDER, OBJPROP_BACK,        false);
   ObjectSetInteger(0, OBJ_DIVIDER, OBJPROP_ZORDER,      1);

   // أيقونة القفل
   ObjectCreate(0, OBJ_LOCK, OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, OBJ_LOCK, OBJPROP_XDISTANCE,  chartW/2);
   ObjectSetInteger(0, OBJ_LOCK, OBJPROP_YDISTANCE,  chartH/2 - 120);
   ObjectSetInteger(0, OBJ_LOCK, OBJPROP_ANCHOR,     ANCHOR_CENTER);
   ObjectSetString (0, OBJ_LOCK, OBJPROP_TEXT,       "🔐");
   ObjectSetString (0, OBJ_LOCK, OBJPROP_FONT,       "Arial");
   ObjectSetInteger(0, OBJ_LOCK, OBJPROP_FONTSIZE,   48);
   ObjectSetInteger(0, OBJ_LOCK, OBJPROP_COLOR,      C'212,175,55');
   ObjectSetInteger(0, OBJ_LOCK, OBJPROP_BACK,       false);
   ObjectSetInteger(0, OBJ_LOCK, OBJPROP_ZORDER,     2);

   // عنوان البوت
   ObjectCreate(0, OBJ_TITLE, OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, OBJ_TITLE, OBJPROP_XDISTANCE, chartW/2);
   ObjectSetInteger(0, OBJ_TITLE, OBJPROP_YDISTANCE, chartH/2 - 50);
   ObjectSetInteger(0, OBJ_TITLE, OBJPROP_ANCHOR,    ANCHOR_CENTER);
   ObjectSetString (0, OBJ_TITLE, OBJPROP_TEXT,      "⬛ GOLD GRID EA v5.0 ⬛");
   ObjectSetString (0, OBJ_TITLE, OBJPROP_FONT,      "Arial Bold");
   ObjectSetInteger(0, OBJ_TITLE, OBJPROP_FONTSIZE,  22);
   ObjectSetInteger(0, OBJ_TITLE, OBJPROP_COLOR,     C'212,175,55');
   ObjectSetInteger(0, OBJ_TITLE, OBJPROP_BACK,      false);
   ObjectSetInteger(0, OBJ_TITLE, OBJPROP_ZORDER,    2);

   // الاسم
   ObjectCreate(0, OBJ_NAME, OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, OBJ_NAME, OBJPROP_XDISTANCE,  chartW/2);
   ObjectSetInteger(0, OBJ_NAME, OBJPROP_YDISTANCE,  chartH/2 + 20);
   ObjectSetInteger(0, OBJ_NAME, OBJPROP_ANCHOR,     ANCHOR_CENTER);
   ObjectSetString (0, OBJ_NAME, OBJPROP_TEXT,       "✦  AHMAD BARGHOUTH  ✦");
   ObjectSetString (0, OBJ_NAME, OBJPROP_FONT,       "Arial Bold");
   ObjectSetInteger(0, OBJ_NAME, OBJPROP_FONTSIZE,   18);
   ObjectSetInteger(0, OBJ_NAME, OBJPROP_COLOR,      clrWhite);
   ObjectSetInteger(0, OBJ_NAME, OBJPROP_BACK,       false);
   ObjectSetInteger(0, OBJ_NAME, OBJPROP_ZORDER,     2);

   //------------------------------------------------------------
   // نجوم كلمة السر على الشاشة ●●●●● بدل الحروف
   //------------------------------------------------------------
{
   int n = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
      if(OrderGetTicket(i) &&
         OrderGetInteger(ORDER_MAGIC) == (long)InpMagicNumber &&
         OrderGetString(ORDER_SYMBOL) == _Symbol)
         n++;
   return n;
}

void CloseAll()
{
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      if(!posInfo.SelectByIndex(i)) continue;
      if(posInfo.Magic() != InpMagicNumber || posInfo.Symbol() != _Symbol) continue;
      trade.PositionClose(posInfo.Ticket());
   }
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      ulong t = OrderGetTicket(i);
      if(t &&


Files:

Responded

1
Developer 1
Rating
(78)
Projects
88
31%
Arbitration
9
11% / 56%
Overdue
4
5%
Working
2
Developer 2
Rating
Projects
1
0%
Arbitration
0
Overdue
0
Free
3
Developer 3
Rating
(546)
Projects
830
62%
Arbitration
33
27% / 45%
Overdue
23
3%
Free
Published: 1 code
4
Developer 4
Rating
Projects
0
0%
Arbitration
0
Overdue
0
Free
Similar orders
Dear Developer, I am looking to hire an experienced Meta Trader4 and 5 (MQL5) Expert Advisor developer to build a custom Expert Advisor for XAUUSD (Gold). This project is based on a structured swing trading system using market structure analysis and multi-timeframe confirmation. PROJECT OVERVIEW The Expert Advisor must be designed to trade XAUUSD using the following multi-timeframe approach: • Daily (D1): Optional
Requirements Specification: Custom Trading Robot (Expert Advisor) I am looking for a qualified developer to design and build a fully automated trading robot (Expert Advisor). The system should be reliable, beginner-friendly, and capable of running with minimal manual input once installed. 1. General Purpose The robot should automatically analyze the market and execute trades. It must work on MetaTrader 4 or
Hi, I need a professional MetaTrader 5 Expert Advisor (Pure MQL5, no Python) with a built-in GUI panel and ultra-fast OnTick execution. The strategy is based only on the last two digits after the decimal point and must work in real time with high accuracy. ### Main Requirements * Pure MQL5 Expert Advisor. * Real-time OnTick processing. * Support XAUUSD and any MT5 symbol. * No fixed price levels; price must be
I am looking for an experienced MQL5 developer to build a robust, high performance Expert advisor (EA) designed specifically for passing and managing funded accounts.The primary focus is to make some good money and also focus on risk management, consistent equity growth
Expert Advisor (EA) Requirements – MT5 (MQL5) Project Overview Develop an automated Expert Advisor (EA) for MetaTrader 5 based on EMA crossover signals combined with strict risk management and trade management principles. The EA must be optimized for Forex pairs and indices and should operate automatically without manual intervention. Entry Conditions Buy Setup Fast EMA crosses above Slow EMA. Current candle closes
I am in need of a profitable scalping EA for gold. No grid or martingale strategy pls. If you have one fully developed and working, pls reach out. You should be able to provide trial version
Simple MT5 indicator showing Friday close to Monday open gap on chart. Features: · Draw horizontal line at Friday close · Label showing gap size in pips · Toggle on/off
Hi. I have the statement of the Ea live results that I want to have. Please check this video from YouTube and the statement to see how the robot is working every day. I want a robot like this or better. The robot has 1-4% drawdown and 300-500% profit per month The robot works with ICMarkets Global 1:500 leverage and FPMarkets. The robot works between 10-30 minutes London session. Also the Robot can start trading from
MT5 Expert Advisor Development Project Overview I am looking for an experienced MQL5 developer to build a custom MetaTrader 5 Expert Advisor based on a grid-cycle trading framework. This is not a standard grid EA . The system combines: Session-based trade initiation Multi-filter signal generation Dynamic grid management Advanced basket management State-machine-driven trade lifecycle management Dynamic take-profit
I'm building a trading signal platform called Tradexa , focused on US30 and Nasdaq indices. For Phase 1, I need a developer to implement the signal-generation engine based on a detailed strategy document that I will provide. Requirements Multi-timeframe analysis (H4 → H1 → M15) Generate signals on M15 only when all strategy conditions are satisfied Detect liquidity sweeps Market structure shift (BOS/CHOCH) Retest

Project information

Budget
1000+ USD

Customer

Placed orders1
Arbitrage count0